gpt4 book ai didi

ssl - 您如何与证书颁发机构签署证书签名请求?

转载 作者:太空宇宙 更新时间:2023-11-04 12:30:10 24 4
gpt4 key购买 nike

在搜索过程中,我发现了几种签署SSL证书签名请求的方法:
使用x509模块:

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

使用 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,然后签署最终实体证书(即服务器或用户)。这两个命令都把这两个步骤省略为一个步骤。两种方法都假设您已经为CAs和服务器(终端实体)证书设置了OpenSSL配置文件。
首先,创建一个基本的 configuration file
$ 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证书和私钥的关键。
调整上面的区域以适合你的口味。在尝试配置文件和命令选项时,默认设置可节省您输入相同信息的时间。
我省略了与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

并用以下方法测试其用途(不要担心 Any Purpose: Yes;请参见 "critical,CA:FALSE" but "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-----

在第二部分中,我将创建另一个易于理解的配置文件。首先, touchopenssl-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 may complain a Common Name is invalid (ERR_CERT_COMMON_NAME_INVALID)。我不确定SAN中的IP地址与此实例中的CN之间的关系。
# IPv4 localhost
IP.1 = 127.0.0.1

# IPv6 localhost
IP.2 = ::1

然后,创建服务器证书请求。请务必省略 -x509*。添加 -x509将创建证书,而不是请求。
$ 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

其次,在 [ CA_default ]openssl-ca.cnf部分添加以下内容。我之前把它们忘了,因为它们会使事情复杂化(当时它们还没用过)。现在你将看到它们是如何使用的,所以希望它们是有意义的。
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中拥有一个新生成的服务器证书。私钥是先前创建的,在 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_default中添加了以下内容: copy_extensions = copy。此副本由提出请求的人提供。
如果省略 copy_extensions = copy,则服务器证书将缺少类似 www.example.commail.example.com的使用者替代名称(san)。
如果您使用 copy_extensions = copy,但不查看请求,那么请求者可能会诱使您签署类似于从属根(而不是服务器或用户证书)的内容。这意味着他/她将能够创建链接回您信任的根的证书。请确保在签名前用 openssl req -verify验证请求。
如果您省略 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非常适合测试。
如果要确保自签名CA、从属CA和结束实体证书之间的组织名称一致,请将以下内容添加到CA配置文件中:
[ policy_match ]
organizationName = match

如果要允许更改组织名称,请使用:
[ policy_match ]
organizationName = supplied

在X.509/PKIX证书中还有其他有关DNS名称处理的规则。有关规则,请参阅这些文档:
RFC 5280, Internet X.509 Public Key Infrastructure Certificate and Certificate Revocation List (CRL) Profile
RFC 6125, Representation and Verification of Domain-Based Application Service Identity within Internet Public Key Infrastructure Using X.509 (PKIX) Certificates in the Context of Transport Layer Security (TLS)
RFC 6797,附录A, HTTP Strict Transport Security (HSTS)
RFC 7469, Public Key Pinning Extension for HTTP
CA/浏览器论坛 Baseline Requirements
CA/浏览器论坛 Extended Validation Guidelines
列出了RFC 6797和RFC 7469,因为它们比其他RFC和CA/B文档更具限制性。RFC的6797和7469也不允许IP地址。

关于ssl - 您如何与证书颁发机构签署证书签名请求?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43527040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com