繁体   English   中英

服务器和客户端证书必须由 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;

您配置证书颁发机构来验证您​​的客户的证书。

服务器证书和客户端证书的使用方式完全不同。

唯一的相似之处是:

  • 它们都包含单词证书
  • 他们都使用公钥和私钥进行加密

“服务器和客户端证书必须由 SSL 中的同一 CA 签名”

简短的回答是,它可以但不是必需的。

要了解原因,让我们分解步骤,但不要太多技术性。

从您设置 nginx 服务器时的角度来看。

你想实现两个目标。

  1. 证明您的服务器的身份。

    为此,您需要一个 CA来签署您的服务器证书并将其呈现给连接到您的服务器的客户端

  2. 验证连接到服务器的客户端的身份

    为此,您设置定义您信任的对客户端证书进行签名的CA 列表

    当客户端连接到您的服务器时,您检查所提供的客户端证书是否由您的 CA 列表签名

那不是结束。 我们来看看客户端。

客户还希望实现两个目标。

  1. 连接到您的服务器时证明客户端的身份

    为此,客户端获得 CA 来签署其客户端证书,并在连接时将其呈现给您的服务器。

    这里有一个问题,签署客户端证书的 CA 必须在您服务器的 CA 列表中。

  2. 验证您的服务器的身份

    为此,客户端必须信任签署服务器证书的 CA。

    这是怎么做的?

    通常这个列表是在系统或浏览器上预先定义的,所以它是透明的。

    但是,如果您正在编写客户端,那么您可能必须定义此受信任 CA 列表,或者只是让客户端知道签署您的服务器证书的 CA。

因此,可能会发生对服务器和客户端进行签名的 CA,但这不是必需的。 这一切都取决于服务器和客户端上定义的 CA 列表。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM