服务器和客户端证书必须由 SSL 中的同一个 CA 签名
Must server and client certificate be signed by same CA in SSL
我试图了解 SSL 连接上下文中客户端和服务器之间的关系。我是否正确理解相同的证书颁发机构(我 - 在下面的示例中)签署服务器和客户端证书这一事实使得它们可以进行通信。因此,只有当客户端使用与服务器证书相同的 CA 签署的客户端证书进行身份验证时,服务器才接受通信,这对于 SSL 连接的想法至关重要?
(下面的脚本直接来自http://blog.nategood.com/client-side-certificate-authentication-in-ngi)
# Create the CA Key and Certificate for signing Client Certs
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# Create the Server Key, CSR, and Certificate
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
# We're self signing our own server cert here. This is a no-no in production.
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# Create the Client Key and CSR
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr
# Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do.
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client on;
简短的回答是否定的。这是两个不同的方面。
这里:
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
您正在配置需要客户端信任的服务器证书。
这里:
ssl_client_certificate /etc/nginx/certs/ca.crt;
您配置证书颁发机构来验证您客户的证书。
服务器证书和客户端证书的使用方式完全不同。
唯一的相似之处是:
- 它们都包含证书一词
- 他们都使用 public 和私钥进行加密
“服务器和客户端证书必须由 SSL 中的同一个 CA 签名”
简短的回答是,它可以但不是必需的。
为了了解原因,让我们分解一下步骤,但不要太技术性。
从您设置 nginx 服务器的角度来看。
您想实现 2 个目标。
证明您服务器的身份。
为此,您将获得 一个 CA 来签署您的 server 证书,并且
将其呈现给连接到您的服务器的客户端
验证连接服务器的客户端身份
为此,您设置定义您信任的签署客户端证书的 CA列表。
当客户端连接到您的服务器时,您检查所提供的 客户端 证书是否由您的 CA
列表签名
这还没有结束。再看看客户端。
客户还想实现 2 个目标。
连接到您的服务器时证明客户端的身份
为此,客户端获得一个 CA 来签署其 客户端 证书,并且
连接时将其呈现给您的服务器。
问题是,签署客户端证书的 CA 必须在您服务器的 CA 列表中。
验证您的服务器身份
为此,客户端必须信任为您的服务器证书签名的 CA。
这是怎么做到的?
通常这个列表是在系统或浏览器上预定义的,所以它是透明的。
但是如果您正在编写客户端,那么您可能必须定义此受信任 CA 列表,或者让客户端知道签署您的服务器证书的 CA。
因此,签署服务器和客户端的 CA 可能是相同的,但这不是必需的。这完全取决于在服务器和客户端上定义的 CA 列表。
我试图了解 SSL 连接上下文中客户端和服务器之间的关系。我是否正确理解相同的证书颁发机构(我 - 在下面的示例中)签署服务器和客户端证书这一事实使得它们可以进行通信。因此,只有当客户端使用与服务器证书相同的 CA 签署的客户端证书进行身份验证时,服务器才接受通信,这对于 SSL 连接的想法至关重要?
(下面的脚本直接来自http://blog.nategood.com/client-side-certificate-authentication-in-ngi)
# Create the CA Key and Certificate for signing Client Certs
openssl genrsa -des3 -out ca.key 4096
openssl req -new -x509 -days 365 -key ca.key -out ca.crt
# Create the Server Key, CSR, and Certificate
openssl genrsa -des3 -out server.key 1024
openssl req -new -key server.key -out server.csr
# We're self signing our own server cert here. This is a no-no in production.
openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
# Create the Client Key and CSR
openssl genrsa -des3 -out client.key 1024
openssl req -new -key client.key -out client.csr
# Sign the client certificate with our CA cert. Unlike signing our own server cert, this is what we want to do.
openssl x509 -req -days 365 -in client.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out client.crt
server {
listen 443;
ssl on;
server_name example.com;
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
ssl_client_certificate /etc/nginx/certs/ca.crt;
ssl_verify_client on;
简短的回答是否定的。这是两个不同的方面。 这里:
ssl_certificate /etc/nginx/certs/server.crt;
ssl_certificate_key /etc/nginx/certs/server.key;
您正在配置需要客户端信任的服务器证书。
这里:
ssl_client_certificate /etc/nginx/certs/ca.crt;
您配置证书颁发机构来验证您客户的证书。
服务器证书和客户端证书的使用方式完全不同。
唯一的相似之处是:
- 它们都包含证书一词
- 他们都使用 public 和私钥进行加密
“服务器和客户端证书必须由 SSL 中的同一个 CA 签名”
简短的回答是,它可以但不是必需的。
为了了解原因,让我们分解一下步骤,但不要太技术性。
从您设置 nginx 服务器的角度来看。
您想实现 2 个目标。
证明您服务器的身份。
为此,您将获得 一个 CA 来签署您的 server 证书,并且 将其呈现给连接到您的服务器的客户端
验证连接服务器的客户端身份
为此,您设置定义您信任的签署客户端证书的 CA列表。
当客户端连接到您的服务器时,您检查所提供的 客户端 证书是否由您的 CA
列表签名
这还没有结束。再看看客户端。
客户还想实现 2 个目标。
连接到您的服务器时证明客户端的身份
为此,客户端获得一个 CA 来签署其 客户端 证书,并且 连接时将其呈现给您的服务器。
问题是,签署客户端证书的 CA 必须在您服务器的 CA 列表中。
验证您的服务器身份
为此,客户端必须信任为您的服务器证书签名的 CA。
这是怎么做到的?
通常这个列表是在系统或浏览器上预定义的,所以它是透明的。
但是如果您正在编写客户端,那么您可能必须定义此受信任 CA 列表,或者让客户端知道签署您的服务器证书的 CA。
因此,签署服务器和客户端的 CA 可能是相同的,但这不是必需的。这完全取决于在服务器和客户端上定义的 CA 列表。