您如何与您的authentication机构签署证书签名请求?

在我的search过程中,我发现了几种签名SSL证书签名请求的方法:

  1. 使用x509模块

    openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt

  2. 使用ca模块

    openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt

注:我不确定使用这个正确的参数。 如果我要使用它,请告知正确的用法

用什么方式用你的authentication中心来签署证书请求? 一种方法比另一种更好(例如,一个被弃用)?

 1. Using the x509 module openssl x509 ... ... 2 Using the ca module openssl ca ... ... 

你所缺less的是这些命令的前奏。

这是一个两步的过程。 首先设置您的CA,然后签署一个最终实体证书(aka服务器或用户)。 这两个命令都将这两个步骤合并为一个。 并假定您已经为CA和服务器(最终实体)证书都设置了OpenSSLconfiguration文件。


首先,创build一个基本的configuration文件 :

 $ touch openssl-ca.cnf 

然后,添加以下内容:

 HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ ca ] default_ca = CA_default # The default ca section [ CA_default ] default_days = 1000 # how long to certify for default_crl_days = 30 # how long before next CRL default_md = sha256 # use public key default MD preserve = no # keep passed DN ordering x509_extensions = ca_extensions # The extensions to add to the cert email_in_dn = no # Don't concat the email in the DN copy_extensions = copy # Required to copy SANs from CSR to cert #################################################################### [ req ] default_bits = 4096 default_keyfile = cakey.pem distinguished_name = ca_distinguished_name x509_extensions = ca_extensions string_mask = utf8only #################################################################### [ ca_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = US stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = Maryland localityName = Locality Name (eg, city) localityName_default = Baltimore organizationName = Organization Name (eg, company) organizationName_default = Test CA, Limited organizationalUnitName = Organizational Unit (eg, division) organizationalUnitName_default = Server Research Department commonName = Common Name (eg server FQDN or YOUR name) commonName_default = Test CA emailAddress = Email Address emailAddress_default = test@example.com #################################################################### [ ca_extensions ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always, issuer basicConstraints = critical, CA:true keyUsage = keyCertSign, cRLSign 

上面的字段取自一个更复杂的openssl.cnf (你可以在/usr/lib/openssl.cnffind它),但我认为它们是创buildCA证书和私钥的基本要素。

调整上面的字段,以适应你的口味。 默认值可以节省您在尝试configuration文件和命令选项时input相同信息的时间。

我省略了与CRL有关的东西,但您的CA操作应该有它们。 请参阅openssl.cnf和相关的crl_ext部分。

然后,执行以下操作。 -nodes省略密码或密码,以便您可以检查证书。 这是一个非常 糟糕的主意,省略密码或密码。

 $ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM 

执行该命令后, cacert.pem将成为CA操作的证书, cakey.pem将成为私钥。 回想一下私钥没有密码或密码。

您可以使用以下方式转储证书。

 $ openssl x509 -in cacert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 11485830970703032316 (0x9f65de69ceef2ffc) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Validity Not Before: Jan 24 14:24:11 2014 GMT Not After : Feb 23 14:24:11 2014 GMT Subject: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (4096 bit) Modulus: 00:b1:7f:29:be:78:02:b8:56:54:2d:2c:ec:ff:6d: ... 39:f9:1e:52:cb:8e:bf:8b:9e:a6:93:e1:22:09:8b: 59:05:9f Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A X509v3 Authority Key Identifier: keyid:4A:9A:F3:10:9E:D7:CF:54:79:DE:46:75:7A:B0:D0:C1:0F:CF:C1:8A X509v3 Basic Constraints: critical CA:TRUE X509v3 Key Usage: Certificate Sign, CRL Sign Signature Algorithm: sha256WithRSAEncryption 4a:6f:1f:ac:fd:fb:1e:a4:6d:08:eb:f5:af:f6:1e:48:a5:c7: ... cd:c6:ac:30:f9:15:83:41:c1:d1:20:fa:85:e7:4f:35:8f:b5: 38:ff:fd:55:68:2c:3e:37 

用下面的方法testing它的目的(不要担心Any Purpose: Yes ,看到“critical,CA:FALSE”,而是“Any Purpose CA:Yes” )。

 $ openssl x509 -purpose -in cacert.pem -inform PEM Certificate purposes: SSL client : No SSL client CA : Yes SSL server : No SSL server CA : Yes Netscape SSL server : No Netscape SSL server CA : Yes S/MIME signing : No S/MIME signing CA : Yes S/MIME encryption : No S/MIME encryption CA : Yes CRL signing : Yes CRL signing CA : Yes Any Purpose : Yes Any Purpose CA : Yes OCSP helper : Yes OCSP helper CA : Yes Time Stamp signing : No Time Stamp signing CA : Yes -----BEGIN CERTIFICATE----- MIIFpTCCA42gAwIBAgIJAJ9l3mnO7y/8MA0GCSqGSIb3DQEBCwUAMGExCzAJBgNV ... aQUtFrV4hpmJUaQZ7ySr/RjCb4KYkQpTkOtKJOU1Ic3GrDD5FYNBwdEg+oXnTzWP tTj//VVoLD43 -----END CERTIFICATE----- 

对于第二部分,我将创build另一个易于理解的conf文件。 首先, touch openssl-server.cnf (也可以为其中的一个用户证书)。

 $ touch openssl-server.cnf 

然后打开它并添加以下内容。

 HOME = . RANDFILE = $ENV::HOME/.rnd #################################################################### [ req ] default_bits = 2048 default_keyfile = serverkey.pem distinguished_name = server_distinguished_name req_extensions = server_req_extensions string_mask = utf8only #################################################################### [ server_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = US stateOrProvinceName = State or Province Name (full name) stateOrProvinceName_default = MD localityName = Locality Name (eg, city) localityName_default = Baltimore organizationName = Organization Name (eg, company) organizationName_default = Test CA, Limited commonName = Common Name (eg server FQDN or YOUR name) commonName_default = Test CA emailAddress = Email Address emailAddress_default = test@example.com #################################################################### [ server_req_extensions ] subjectKeyIdentifier = hash basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment subjectAltName = @alternate_names nsComment = "OpenSSL Generated Certificate" #################################################################### [ alternate_names ] DNS.1 = example.com DNS.2 = www.example.com DNS.3 = mail.example.com DNS.4 = ftp.example.com 

如果您正在开发并需要将您的工作站用作服务器,那么您可能需要为Chrome执行以下操作。 否则Chrome可能会抱怨通用名称无效( ERR_CERT_COMMON_NAME_INVALID ) 。 我不确定SAN中的IP地址和CN中的CN是什么关系。

 # IPv4 localhost IP.1 = 127.0.0.1 # IPv6 localhost IP.2 = ::1 

然后,创build服务器证书请求。 一定要省略 -x509 *。 添加-x509将创build一个证书,而不是一个请求。

 $ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM 

执行此命令后,您将在servercert.csr有一个请求,并在serverkey.pem有一个私钥。

你可以再检查一遍。

 $ openssl req -text -noout -verify -in servercert.csr Certificate: verify OK Certificate Request: Version: 0 (0x0) Subject: C=US, ST=MD, L=Baltimore, CN=Test Server/emailAddress=test@example.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d: ... f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51: 86:e1 Exponent: 65537 (0x10001) Attributes: Requested Extensions: X509v3 Subject Key Identifier: 1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61 X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com Netscape Comment: OpenSSL Generated Certificate Signature Algorithm: sha256WithRSAEncryption 6d:e8:d3:85:b3:88:d4:1a:80:9e:67:0d:37:46:db:4d:9a:81: ... 76:6a:22:0a:41:45:1f:e2:d6:e4:8f:a1:ca:de:e5:69:98:88: a9:63:d0:a7 

接下来,你必须用你的CA签名。


您几乎已经准备好通过您的CA签署服务器的证书。 在发布命令之前,CA的openssl-ca.cnf需要两个部分。

首先打开openssl-ca.cnf并添加以下两节。

 #################################################################### [ signing_policy ] countryName = optional stateOrProvinceName = optional localityName = optional organizationName = optional organizationalUnitName = optional commonName = supplied emailAddress = optional #################################################################### [ signing_req ] subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer basicConstraints = CA:FALSE keyUsage = digitalSignature, keyEncipherment 

其次,将以下内容添加到openssl-ca.cnf[ CA_default ]部分。 我之所以把它们排除在外是因为它们会使事情变得复杂(当时它们还没有被使用)。 现在你会看到他们如何被使用,所以希望他们会有道理。

 base_dir = . certificate = $base_dir/cacert.pem # The CA certifcate private_key = $base_dir/cakey.pem # The CA private key new_certs_dir = $base_dir # Location for new certs after signing database = $base_dir/index.txt # Database index file serial = $base_dir/serial.txt # The current serial number unique_subject = no # Set to 'no' to allow creation of # several certificates with same subject. 

三,触摸index.txtserial.txt

 $ touch index.txt $ echo '01' > serial.txt 

然后,执行以下操作:

 $ openssl ca -config openssl-ca.cnf -policy signing_policy -extensions signing_req -out servercert.pem -infiles servercert.csr 

您应该看到类似于以下内容:

 Using configuration from openssl-ca.cnf Check that the request matches the signature Signature ok The Subject's Distinguished Name is as follows countryName :PRINTABLE:'US' stateOrProvinceName :ASN.1 12:'MD' localityName :ASN.1 12:'Baltimore' commonName :ASN.1 12:'Test CA' emailAddress :IA5STRING:'test@example.com' Certificate is to be certified until Oct 20 16:12:39 2016 GMT (1000 days) Sign the certificate? [y/n]:Y 1 out of 1 certificate requests certified, commit? [y/n]Y Write out database with 1 new entries Data Base Updated 

执行该命令后,您将在servercert.pem拥有一个新的服务器证书。 私钥是早先创build的,可在serverkey.pem

最后,您可以使用以下方式检查新鲜出炉的证书。

 $ openssl x509 -in servercert.pem -text -noout Certificate: Data: Version: 3 (0x2) Serial Number: 9 (0x9) Signature Algorithm: sha256WithRSAEncryption Issuer: C=US, ST=MD, L=Baltimore, CN=Test CA/emailAddress=test@example.com Validity Not Before: Jan 24 19:07:36 2014 GMT Not After : Oct 20 19:07:36 2016 GMT Subject: C=US, ST=MD, L=Baltimore, CN=Test Server Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (2048 bit) Modulus: 00:ce:3d:58:7f:a0:59:92:aa:7c:a0:82:dc:c9:6d: ... f9:5e:0c:ba:84:eb:27:0d:d9:e7:22:5d:fe:e5:51: 86:e1 Exponent: 65537 (0x10001) X509v3 extensions: X509v3 Subject Key Identifier: 1F:09:EF:79:9A:73:36:C1:80:52:60:2D:03:53:C7:B6:BD:63:3B:61 X509v3 Authority Key Identifier: keyid:42:15:F2:CA:9C:B1:BB:F5:4C:2C:66:27:DA:6D:2E:5F:BA:0F:C5:9E X509v3 Basic Constraints: CA:FALSE X509v3 Key Usage: Digital Signature, Key Encipherment X509v3 Subject Alternative Name: DNS:example.com, DNS:www.example.com, DNS:mail.example.com, DNS:ftp.example.com Netscape Comment: OpenSSL Generated Certificate Signature Algorithm: sha256WithRSAEncryption b1:40:f6:34:f4:38:c8:57:d4:b6:08:f7:e2:71:12:6b:0e:4a: ... 45:71:06:a9:86:b6:0f:6d:8d:e1:c5:97:8d:fd:59:43:e9:3c: 56:a5:eb:c8:7e:9f:6b:7a 

此前,您将以下内容添加到CA_defaultcopy_extensions = copy 。 这复制提出请求的人提供的扩展名。

如果您省略了copy_extensions = copy ,那么您的服务器证书将缺less诸如www.example.commail.example.com类的主题备用名称(SAN)。

如果使用copy_extensions = copy但不查看请求,则请求者可能会诱使您签署类似下级根(而不是服务器或用户证书)的东西。 这意味着他将能够将证书链接回受信任的根。 请务必在签名前使用openssl req -verifyvalidation请求。


如果您忽略了 unique_subject或将其设置为yes ,则只允许您在主题的专有名称下创build一个证书。

 unique_subject = yes # Set to 'no' to allow creation of # several ctificates with same subject. 

尝试在实验时创build第二个证书时,在使用CA的私钥签署服务器证书时将导致以下结果:

 Sign the certificate? [y/n]:Y failed to update database TXT_DB error number 2 

所以unique_subject = no是完美的testing。


如果要确保组织名称在自签名CA,从属CA和最终实体证书之间保持一致,请将以下内容添加到您的CAconfiguration文件中:

 [ policy_match ] organizationName = match 

如果您想允许更改组织名称,请使用:

 [ policy_match ] organizationName = supplied 

还有其他有关处理X.509 / PKIX证书中的DNS名称的规则。 有关规则,请参阅这些文档:

  • RFC 5280, Internet X.509公钥基础设施证书和证书撤销列表(CRL)configuration文件
  • RFC 6125: 在传输层安全性(TLS)环境中使用X.509(PKIX)证书在Internet公钥基础结构内表示和validation基于域的应用服务标识
  • RFC 6797,附录A, HTTP严格传输安全性(HSTS)
  • RFC 7469, HTTP的公钥固定扩展
  • CA /浏览器论坛基线要求
  • CA /浏览器论坛扩展validation指南

列出了RFC 6797和RFC 7469,因为它们比其他RFC和CA / B文档更具限制性。 RFC 6797和7469 不允许IP地址。