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

时间:2018-11-12 18:14:35

标签: ssl nginx openssl 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;

3 个答案:

答案 0 :(得分:2)

简短的回答是“否”。这是两个不同的方面。 在这里:

ssl_certificate      /etc/nginx/certs/server.crt;
ssl_certificate_key  /etc/nginx/certs/server.key;

您正在配置需要客户端信任的服务器证书。 在这里:

ssl_client_certificate /etc/nginx/certs/ca.crt;

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

答案 1 :(得分:0)

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

唯一的相似之处是:

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

答案 2 :(得分:0)

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

最简单的答案是,它可以但不是必需的。

要了解原因,让我们分解步骤,但无需过多的技术知识。

从设置Nginx服务器的角度来看。

您要实现2个目标。

  1. 证明服务器的身份。

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

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

    为此,您设置定义用于信任客户证书的CA的列表

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

这还没有结束。让我们看看客户端的目的。

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

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

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

    这是陷阱,签署客户端证书的CA必须在您服务器的CA列表中。

  2. 验证服务器的身份

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

    这是怎么做的?

    此列表通常是系统或浏览器上预先定义的,因此透明地显示。

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

因此,可能会发生签署服务器和客户端的CA相同的CA,但这不是必需的。这完全取决于在服务器和客户端上定义的CA列表。

相关问题