【问题标题】:Must server and client certificate be signed by same CA in SSL服务器和客户端证书必须由 SSL 中的同一 CA 签名
【发布时间】:2019-04-15 12:15:24
【问题描述】:

我试图在 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;

【问题讨论】:

  • 没有。客户端需要信任签署服务器证书的 CA,服务器需要信任签署客户端证书的 CA。
  • 但是是否可以使用由不同 CA 签名的服务器和客户端证书来建立连接?所以,当客户端和服务器证书时。没有共同点...
  • 我展示的 scipts 中如何体现“信任”?
  • 相同的 CA,不同的 CA,没有区别。 ssl_client_certificate 指令告诉服务器信任哪个客户端 CA,浏览器的证书管理器包含浏览器信任的所有服务器 CA。

标签: ssl nginx openssl ca


【解决方案1】:

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

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

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

从你设置 nginx 服务器时的观点来看。

你想要实现 2 个目标。

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

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

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

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

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

这还没有结束。我们来看看客户端。

客户还想实现 2 个目标。

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

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

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

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

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

    这是怎么做到的?

    通常,此列表是在系统或浏览器上预定义的,因此它会透明地发生。

    但是如果你正在编写一个客户端,那么你可能需要定义这个受信任的 CA 列表,或者只是让客户端知道签署你的服务器证书的 CA。

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

【讨论】:

    【解决方案2】:

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

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

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

    这里:

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

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

    【讨论】:

      【解决方案3】:

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

      唯一的相似之处是:

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

      【讨论】:

      • 没有真正回答“服务器和客户端证书必须由 SSL 中的同一个 CA 签名”的问题
      猜你喜欢
      • 2011-06-11
      • 2010-11-13
      • 2012-08-22
      • 2014-06-07
      • 1970-01-01
      • 1970-01-01
      • 2013-09-08
      • 2015-10-20
      • 2011-02-23
      相关资源
      最近更新 更多