ssl csr產生 - 您如何與您的認證機構簽署證書籤名請求?




openssl generator (3)

在我的搜索過程中,我發現了幾種簽署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
    

注:我不確定使用這個正確的參數。 如果我要使用它,請告知正確的用法。

用什麼方式來與您的認證中心簽署證書請求? 一種方法比另一種更好嗎(例如,一種方法被棄用)?


Answers

1. Using the x509 module
openssl x509 ...
...

2 Using the ca module
openssl ca ...
...

你缺少的是這些命令的前奏。

這是一個兩步過程。 首先設置您的CA,然後簽署最終實體證書(aka服務器或用戶)。 兩個命令都將這兩個步驟合併為一個。 並且都假定您已經為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 = [email protected]

####################################################################
[ 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/[email protected]
        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/[email protected]
        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” )。

$ 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-----

對於第二部分,我將創建另一個易於理解的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 Server, Limited

commonName           = Common Name (e.g. server FQDN or YOUR name)
commonName_default   = Test Server

emailAddress         = Email Address
emailAddress_default = [email protected]

####################################################################
[ 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之間的關係。

# 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/[email protected]
        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:'[email protected]'
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/[email protected]
        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添加了以下CA_defaultcopy_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 6797和RFC 7469,因為它們比其他RFC和CA / B文檔更具限制性。 RFC 6797和7469 不允許IP地址。


除了@jww的回答之外,我想說的是在openssl-ca.cnf中的配置

default_days     = 1000         # how long to certify for

定義由root-ca簽名的證書的默認天數是有效的,為了設置root-ca本身的有效性,您應該使用“-days n”選項

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

如果沒有這樣做,您的root-ca將僅在默認1個月內有效,並且此rot-ca簽名的任何證書也將具有1個月的有效期。


我找到的最好的免費SSL重定向服務是CloudFlare 。 為了讓它運作:

  1. 添加您的域並將您的名稱服務器切換到CloudFlare(註冊過程引導您完成它)
  2. 添加goto CloudFlare設置並下載到SSL。 將設置更改為“完整SSL(嚴格)”,這要求您在重定向到的子域上擁有有效的證書(SNI正常工作)。
  3. 返回您的網站列表,再次選擇域以及選項轉到頁面規則。 添加“轉發”規則,將https://yourdomain.com/*重定向到https://www.yourdomain.com/$1 (將www替換為任何子域),確保重定向設置為301。
  4. 保存您的設置並坐下來等待所有內容傳播。

完成。 裸域的自由安全SSL重定向。





ssl openssl csr ca