在搜索过程中,我发现了几种签署 SSL 证书签名请求的方法:
使用x509模块:
x509
openssl x509 -req -days 360 -in server.csr -CA ca.crt -CAkey ca.key -CAcreateserial -out server.crt
使用ca模块:
ca
openssl ca -cert ca.crt -keyfile ca.key -in server.csr -out server.crt
注意:我不确定是否使用了正确的参数。如果我要使用它,请告知正确的用法。
应该使用哪种方式与您的证书颁发机构签署证书请求?一种方法是否比另一种更好(例如,一种方法已被弃用)?
1. Using the x509 module openssl x509 ... ... 2 Using the ca module openssl ca ... ...
你错过了这些命令的前奏。
这是一个两步过程。首先设置 CA,然后签署最终实体证书(也称为服务器或用户)。这两个命令都将两个步骤合二为一。两者都假设您已经为 CA 和服务器(终端实体)证书设置了一个 OpenSSL 配置文件。
首先,创建一个基本配置文件:
$ 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 (e.g. 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.cnf),但我认为它们是创建 CA 证书和私钥的必需品。
openssl.cnf
/usr/lib/openssl.cnf
调整上面的字段以适应您的口味。默认设置可以节省您在尝试配置文件和命令选项时输入相同信息的时间。
我省略了与 CRL 相关的内容,但您的 CA 操作应该有它们。请参阅openssl.cnf和相关crl_ext部分。
crl_ext
然后,执行以下操作。-nodes省略密码或密码,以便您可以检查证书。省略密码或密码短语是一个 非常 糟糕的主意。
-nodes
$ openssl req -x509 -config openssl-ca.cnf -newkey rsa:4096 -sha256 -nodes -out cacert.pem -outform PEM
命令执行后,cacert.pem将是您用于 CA 操作的证书,并且cakey.pem将是私钥。回想一下,私钥 没有 密码或密码。
cacert.pem
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
并使用以下内容测试其目的(不要担心Any Purpose: Yes; 请参阅“critical,CA:FALSE”但“Any Purpose CA : Yes”)。
Any Purpose: 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-----
对于第二部分,我将创建另一个易于理解的配置文件。首先,touch(openssl-server.cnf您也可以为用户证书制作其中之一)。
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 Server, Limited commonName = Common Name (e.g. server FQDN or YOUR name) commonName_default = Test Server 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 可能会抱怨 Common Name is invalid ( ERR_CERT_COMMON_NAME_INVALID)。在这种情况下,我不确定 SAN 中的 IP 地址和 CN 之间的关系是什么。
ERR_CERT_COMMON_NAME_INVALID
# IPv4 localhost IP.1 = 127.0.0.1 # IPv6 localhost IP.2 = ::1
然后,创建服务器证书请求。一定要 省略 -x509*. 添加-x509将创建一个证书,而不是一个请求。
-x509
$ openssl req -config openssl-server.cnf -newkey rsa:2048 -sha256 -nodes -out servercert.csr -outform PEM
此命令执行后,您将有一个请求 inservercert.csr和一个私钥 in serverkey.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 签署服务器证书。CAopenssl-ca.cnf在发出命令之前还需要两个部分。
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
其次,将以下内容添加[ CA_default ]到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.txt和serial.txt:
index.txt
serial.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. 私钥是较早创建的,可在serverkey.pem.
servercert.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_default: copy_extensions = copy。这复制了提出请求的人提供的扩展名。
CA_default
copy_extensions = copy
如果您省略copy_extensions = copy,那么您的服务器证书将缺少主题备用名称 (SAN),例如www.example.com和mail.example.com。
www.example.com
mail.example.com
如果您使用copy_extensions = copy,但不查看请求,则请求者可能会诱骗您签署诸如从属根(而不是服务器或用户证书)之类的东西。这意味着他/她将能够铸造链接回您信任的根的证书。请务必openssl req -verify在签名前验证请求。
openssl req -verify
如果您 省略 unique_subject或将其设置为yes,那么您将只能在主题的专有名称下创建 一个 证书。
unique_subject
yes
unique_subject = yes # Set to 'no' to allow creation of # several ctificates with same subject.
在尝试使用 CA 的私钥签署服务器证书时,尝试创建第二个证书将导致以下结果:
Sign the certificate? [y/n]:Y failed to update database TXT_DB error number 2
所以unique_subject = no非常适合测试。
unique_subject = no
如果要确保自签名 CA、 从属 CA 和 最终实体证书之间的 组织名称 一致,请将以下内容添加到您的 CA 配置文件中:
[ policy_match ] organizationName = match
如果要允许更改 组织名称,请使用:
[ policy_match ] organizationName = supplied
关于在 X.509/PKIX 证书中处理 DNS 名称还有其他规则。有关规则,请参阅这些文档:
列出了 RFC 6797 和 RFC 7469,因为它们比其他 RFC 和 CA/B 文档更严格。RFC 的 6797 和 7469 也不允许 IP 地址。