openssl req(生成證書請求和自建CA)
偽命令req大致有3個功能:生成證書請求文件、驗證證書請求文件和創建根CA。由於openssl req命令選項較多,所以先各舉幾個例子,再集中給出openssl req的選項說明。若已熟悉openssl req和證書請求相關知識,可直接跳至后文查看openssl req選項整理,若不熟悉,建議從前向后一步一步閱讀。
首先說明下生成證書請求需要什么:申請者需要將自己的信息及其公鑰放入證書請求中。但在實際操作過程中,所需要提供的是私鑰而非公鑰,因為它會自動從私鑰中提取公鑰。另外,還需要將提供的數據進行數字簽名(使用單向加密),保證該證書請求文件的完整性和一致性,防止他人盜取后進行篡改,例如黑客將為www.baidu.com所申請的證書請求文件中的公司名改成對方的公司名稱,如果能夠篡改成功,則簽署該證書請求時,所頒發的證書信息中將變成他人信息。
所以第一步就是先創建出私鑰pri_key.pem。其實私鑰文件是非必需的,因為openssl req在需要它的時候會自動創建在特定的路徑下,此處為了舉例說明,所以創建它。
[root@xuexi tmp]# openssl genrsa -out pri_key.pem
(1).根據私鑰pri_key.pem生成一個新的證書請求文件。其中"-new"表示新生成一個新的證書請求文件,"-key"指定私鑰文件,"-out"指定輸出文件,此處輸出文件即為證書請求文件。
[root@xuexi tmp]# openssl req -new -key pri_key.pem -out req1.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:CN State or Province Name (full name) []:FJ Locality Name (eg, city) [Default City]:XM Organization Name (eg, company) [Default Company Ltd]:. Organizational Unit Name (eg, section) []:. Common Name (eg, your name or your server's hostname) []:www.youwant.com Email Address []: Please enter the following 'extra' attributes # 下面兩項幾乎不用考慮,留空即可 to be sent with your certificate request A challenge password []:. An optional company name []:.
在敲下回車鍵后,默認會進入交互模式讓你提供你個人的信息,需要注意的是,如果某些信息不想填可以選擇使用默認值,也可以選擇留空不填,直接回車將選擇使用默認值,輸入點"."將表示該信息項留空。但某些項是必填項,否則未來證書簽署時將失敗。如"Common Name",它表示的是為哪個域名、子域名或哪個主機申請證書,未來證書請求被簽署后將只能應用於"Common Name"所指定的地址。具體哪些必填項還需要看所使用的配置文件(默認的配置文件為/etc/pki/tls/openssl.cnf)中的定義,此處暫且不討論配置相關內容,僅提供Common Name即可。
除了"-new"選項,使用"-newkey"選項也能創建證書請求文件,此處暫不舉例說明"-newkey"的用法,后文會有示例。
(2).查看證書請求文件內容。
現在已經生成了一個新的證書請求文件req1.csr。查看下該證書請求文件的內容。
[root@xuexi tmp]# cat req1.csr -----BEGIN CERTIFICATE REQUEST----- # 證書請求的內容 MIIBgDCB6gIBADBBMQswCQYDVQQGEwJDTjELMAkGA1UECAwCRkoxCzAJBgNVBAcM AlhNMRgwFgYDVQQDDA93d3cueW91d2FudC5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBAMbx9bfsC0GTn7DijfGFs56Fb8atX9ABRDE/wmE74jXjdfbH4ZOg Te0Orlu5pA4jqXDgSLzlQvjD6QsyhToyvtyQbgGSfXSVOPcgfAohDNo9t6+mnvs/ 5rFQJ1+uI6gsLMbwQBJidLGnM1pOvFo2671Vm2jewDLVweGP5wmIfDyLAgMBAAGg ADANBgkqhkiG9w0BAQUFAAOBgQAqKYjNKKpNCvwDNeDeYynOx1XD/OYgAU43Sq03 aRUcKenqICkvkXkUE+H0lYMtXcDL/rgDyjlKvwartgZ/ngoKSwtXhd4UivII2hNN jolE3gfe8KGjMpnX/8oxkJIoSTETqee+11ez8E2fya1DwoQnKpXjTt5qya8VWflt DG8WmA== -----END CERTIFICATE REQUEST-----
更具體的可以使用openssl req命令查看。命令如下,其中"-in"選項指定的是證書請求文件。
[root@xuexi tmp]# openssl req -in req1.csr -----BEGIN CERTIFICATE REQUEST----- # 證書請求的內容 MIIBgDCB6gIBADBBMQswCQYDVQQGEwJDTjELMAkGA1UECAwCRkoxCzAJBgNVBAcM AlhNMRgwFgYDVQQDDA93d3cueW91d2FudC5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBAMbx9bfsC0GTn7DijfGFs56Fb8atX9ABRDE/wmE74jXjdfbH4ZOg Te0Orlu5pA4jqXDgSLzlQvjD6QsyhToyvtyQbgGSfXSVOPcgfAohDNo9t6+mnvs/ 5rFQJ1+uI6gsLMbwQBJidLGnM1pOvFo2671Vm2jewDLVweGP5wmIfDyLAgMBAAGg ADANBgkqhkiG9w0BAQUFAAOBgQAqKYjNKKpNCvwDNeDeYynOx1XD/OYgAU43Sq03 aRUcKenqICkvkXkUE+H0lYMtXcDL/rgDyjlKvwartgZ/ngoKSwtXhd4UivII2hNN jolE3gfe8KGjMpnX/8oxkJIoSTETqee+11ez8E2fya1DwoQnKpXjTt5qya8VWflt DG8WmA== -----END CERTIFICATE REQUEST-----
查看請求文件時,可以結合其他幾個選項輸出特定的內容。"-text"選項表示以文本格式輸出證書請求文件的內容。
[root@xuexi tmp]# openssl req -in req1.csr -text Certificate Request: # 此為證書請求文件頭 Data: Version: 0 (0x0) Subject: C=CN, ST=FJ, L=XM, CN=www.youwant.com # 此為提供的個人信息,注意左側標頭為"Subject",這是很重要的一項 Subject Public Key Info: Public Key Algorithm: rsaEncryption # 使用的公鑰算法 Public-Key: (1024 bit) # 公鑰的長度 Modulus: 00:c6:f1:f5:b7:ec:0b:41:93:9f:b0:e2:8d:f1:85: b3:9e:85:6f:c6:ad:5f:d0:01:44:31:3f:c2:61:3b: e2:35:e3:75:f6:c7:e1:93:a0:4d:ed:0e:ae:5b:b9: a4:0e:23:a9:70:e0:48:bc:e5:42:f8:c3:e9:0b:32: 85:3a:32:be:dc:90:6e:01:92:7d:74:95:38:f7:20: 7c:0a:21:0c:da:3d:b7:af:a6:9e:fb:3f:e6:b1:50: 27:5f:ae:23:a8:2c:2c:c6:f0:40:12:62:74:b1:a7: 33:5a:4e:bc:5a:36:eb:bd:55:9b:68:de:c0:32:d5: c1:e1:8f:e7:09:88:7c:3c:8b Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha1WithRSAEncryption # 為請求文件數字簽名時使用的算法 2a:29:88:cd:28:aa:4d:0a:fc:03:35:e0:de:63:29:ce:c7:55: c3:fc:e6:20:01:4e:37:4a:ad:37:69:15:1c:29:e9:ea:20:29: 2f:91:79:14:13:e1:f4:95:83:2d:5d:c0:cb:fe:b8:03:ca:39: 4a:bf:06:ab:b6:06:7f:9e:0a:0a:4b:0b:57:85:de:14:8a:f2: 08:da:13:4d:8e:89:44:de:07:de:f0:a1:a3:32:99:d7:ff:ca: 31:90:92:28:49:31:13:a9:e7:be:d7:57:b3:f0:4d:9f:c9:ad: 43:c2:84:27:2a:95:e3:4e:de:6a:c9:af:15:59:f9:6d:0c:6f: 16:98 -----BEGIN CERTIFICATE REQUEST----- MIIBgDCB6gIBADBBMQswCQYDVQQGEwJDTjELMAkGA1UECAwCRkoxCzAJBgNVBAcM AlhNMRgwFgYDVQQDDA93d3cueW91d2FudC5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBAMbx9bfsC0GTn7DijfGFs56Fb8atX9ABRDE/wmE74jXjdfbH4ZOg Te0Orlu5pA4jqXDgSLzlQvjD6QsyhToyvtyQbgGSfXSVOPcgfAohDNo9t6+mnvs/ 5rFQJ1+uI6gsLMbwQBJidLGnM1pOvFo2671Vm2jewDLVweGP5wmIfDyLAgMBAAGg ADANBgkqhkiG9w0BAQUFAAOBgQAqKYjNKKpNCvwDNeDeYynOx1XD/OYgAU43Sq03 aRUcKenqICkvkXkUE+H0lYMtXcDL/rgDyjlKvwartgZ/ngoKSwtXhd4UivII2hNN jolE3gfe8KGjMpnX/8oxkJIoSTETqee+11ez8E2fya1DwoQnKpXjTt5qya8VWflt DG8WmA== -----END CERTIFICATE REQUEST-----
將"-text"和"-noout"結合使用,則只輸出證書請求的文件頭部分。
[root@xuexi tmp]# openssl req -in req1.csr -noout -text Certificate Request: Data: Version: 0 (0x0) Subject: C=CN, ST=FJ, L=XM, CN=www.youwant.com Subject Public Key Info: Public Key Algorithm: rsaEncryption Public-Key: (1024 bit) Modulus: 00:c6:f1:f5:b7:ec:0b:41:93:9f:b0:e2:8d:f1:85: b3:9e:85:6f:c6:ad:5f:d0:01:44:31:3f:c2:61:3b: e2:35:e3:75:f6:c7:e1:93:a0:4d:ed:0e:ae:5b:b9: a4:0e:23:a9:70:e0:48:bc:e5:42:f8:c3:e9:0b:32: 85:3a:32:be:dc:90:6e:01:92:7d:74:95:38:f7:20: 7c:0a:21:0c:da:3d:b7:af:a6:9e:fb:3f:e6:b1:50: 27:5f:ae:23:a8:2c:2c:c6:f0:40:12:62:74:b1:a7: 33:5a:4e:bc:5a:36:eb:bd:55:9b:68:de:c0:32:d5: c1:e1:8f:e7:09:88:7c:3c:8b Exponent: 65537 (0x10001) Attributes: a0:00 Signature Algorithm: sha1WithRSAEncryption # 為請求文件數字簽名時使用的算法 2a:29:88:cd:28:aa:4d:0a:fc:03:35:e0:de:63:29:ce:c7:55: c3:fc:e6:20:01:4e:37:4a:ad:37:69:15:1c:29:e9:ea:20:29: 2f:91:79:14:13:e1:f4:95:83:2d:5d:c0:cb:fe:b8:03:ca:39: 4a:bf:06:ab:b6:06:7f:9e:0a:0a:4b:0b:57:85:de:14:8a:f2: 08:da:13:4d:8e:89:44:de:07:de:f0:a1:a3:32:99:d7:ff:ca: 31:90:92:28:49:31:13:a9:e7:be:d7:57:b3:f0:4d:9f:c9:ad: 43:c2:84:27:2a:95:e3:4e:de:6a:c9:af:15:59:f9:6d:0c:6f: 16:98
還可以只輸出subject部分的內容。
[root@xuexi tmp]# openssl req -in req2.csr -subject -noout subject=/C=CN/ST=FJ/L=XM/CN=www.youwant.com
也可以使用"-pubkey"輸出證書請求文件中的公鑰內容。如果從申請證書請求時所提供的私鑰中提取出公鑰,這兩段公鑰的內容是完全一致的。
[root@xuexi tmp]# openssl req -in req1.csr -pubkey -noout -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG8fW37AtBk5+w4o3xhbOehW/G rV/QAUQxP8JhO+I143X2x+GToE3tDq5buaQOI6lw4Ei85UL4w+kLMoU6Mr7ckG4B kn10lTj3IHwKIQzaPbevpp77P+axUCdfriOoLCzG8EASYnSxpzNaTrxaNuu9VZto 3sAy1cHhj+cJiHw8iwIDAQAB -----END PUBLIC KEY-----
[root@xuexi tmp]# openssl rsa -in pri_key.pem -pubout writing RSA key -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDG8fW37AtBk5+w4o3xhbOehW/G rV/QAUQxP8JhO+I143X2x+GToE3tDq5buaQOI6lw4Ei85UL4w+kLMoU6Mr7ckG4B kn10lTj3IHwKIQzaPbevpp77P+axUCdfriOoLCzG8EASYnSxpzNaTrxaNuu9VZto 3sAy1cHhj+cJiHw8iwIDAQAB -----END PUBLIC KEY-----
(3).指定證書請求文件中的簽名算法。
注意到證書請求文件的頭部分有一項是"Signature Algorithm",它表示使用的是哪種數字簽名算法。默認使用的是sha1,還支持md5、sha512等,更多可支持的簽名算法見"openssl dgst --help"中所列出內容。例如此處指定md5算法。
[root@xuexi tmp]# openssl req -new -key pri_key.pem -out req2.csr -md5 [root@xuexi tmp]# openssl req -in req2.csr -noout -text | grep Algo Public Key Algorithm: rsaEncryption Signature Algorithm: md5WithRSAEncryption
(4).驗證請求文件的數字簽名,這樣可以驗證出證書請求文件是否被篡改過。下面的命令中"-verify"選項表示驗證證書請求文件的數字簽名。
[root@xuexi tmp]# openssl req -verify -in req2.csr verify OK -----BEGIN CERTIFICATE REQUEST----- MIIBgDCB6gIBADBBMQswCQYDVQQGEwJDTjELMAkGA1UECAwCRkoxCzAJBgNVBAcM AlhNMRgwFgYDVQQDDA93d3cueW91d2FudC5jb20wgZ8wDQYJKoZIhvcNAQEBBQAD gY0AMIGJAoGBAMbx9bfsC0GTn7DijfGFs56Fb8atX9ABRDE/wmE74jXjdfbH4ZOg Te0Orlu5pA4jqXDgSLzlQvjD6QsyhToyvtyQbgGSfXSVOPcgfAohDNo9t6+mnvs/ 5rFQJ1+uI6gsLMbwQBJidLGnM1pOvFo2671Vm2jewDLVweGP5wmIfDyLAgMBAAGg ADANBgkqhkiG9w0BAQQFAAOBgQCcvWuwmeAowbqLEsSpBVGnRfDEeH897v1r/SaX 9yYhpc3Kp5HKQ3LpSZBYGxlIsE6I3DMT5d1wcPeKRi8B6BIfemYOEbhLVGLmhNAg iHyV/s1/TaOc31QZMY1HvD5BTOlhed+MpevWAFX2CRXuhKYBOimCrGNJxrFj4srJ M1zDOA== -----END CERTIFICATE REQUEST-----
結果中第一行的"verify OK"表示證書請求文件是完整未被篡改過的,但同時輸出了證書請求的內容。如果不想輸出這部分內容,使用"-noout"選項即可。
[root@xuexi tmp]# openssl req -verify -in req2.csr -noout verify OK
(5).自簽署證書,可用於自建根CA時。
使用openssl req自簽署證書時,需要使用"-x509"選項,由於是簽署證書請求文件,所以可以指定"-days"指定所頒發的證書有效期。
[root@xuexi tmp]# openssl req -x509 -key pri_key.pem -in req1.csr -out CA1.crt -days 365
由於openssl req命令的主要功能是創建和管理證書請求文件,所以沒有提供對證書文件的管理能力,暫時也就只能通過cat來查看證書文件CA1.crt了。
[root@xuexi tmp]# cat CA1.crt -----BEGIN CERTIFICATE----- MIICUDCCAbmgAwIBAgIJAIrxQ+zicLzIMA0GCSqGSIb3DQEBBQUAMEExCzAJBgNV BAYTAkNOMQswCQYDVQQIDAJGSjELMAkGA1UEBwwCWE0xGDAWBgNVBAMMD3d3dy55 b3V3YW50LmNvbTAeFw0xNzA2MjcwNzU0NTJaFw0xODA2MjcwNzU0NTJaMEExCzAJ BgNVBAYTAkNOMQswCQYDVQQIDAJGSjELMAkGA1UEBwwCWE0xGDAWBgNVBAMMD3d3 dy55b3V3YW50LmNvbTCBnzANBgkqhkiG9w0BAQEFAAOBjQAwgYkCgYEAxvH1t+wL QZOfsOKN8YWznoVvxq1f0AFEMT/CYTviNeN19sfhk6BN7Q6uW7mkDiOpcOBIvOVC +MPpCzKFOjK+3JBuAZJ9dJU49yB8CiEM2j23r6ae+z/msVAnX64jqCwsxvBAEmJ0 saczWk68WjbrvVWbaN7AMtXB4Y/nCYh8PIsCAwEAAaNQME4wHQYDVR0OBBYEFMLa Dm9yZeRh3Bu+zmpU2iKbQBQgMB8GA1UdIwQYMBaAFMLaDm9yZeRh3Bu+zmpU2iKb QBQgMAwGA1UdEwQFMAMBAf8wDQYJKoZIhvcNAQEFBQADgYEAd2CJPe987RO34ySA 7EC0zQkhDz9d2vvvPWYjq0XA/frntlKKhgFwypWPBwwFTBwfvLHMnNpKy0zXXAkB 1ttgzMgka/qv/gcKoLN3dwM7Hz+eCl/cXVJmVG7PqAjfqSr6IyM7v/B6dC0Xv49m h5mv24HqKtJoEeI0iARaNmOxKeE= -----END CERTIFICATE-----
實際上,"-x509"選項和"-new"或"-newkey"配合使用時,可以不指定證書請求文件,它在自簽署過程中將在內存中自動創建證書請求文件,當然,既然要創建證書請求文件,就需要人為輸入申請者的信息了。例如:
[root@xuexi tmp]# openssl req -new -x509 -key pri_key.pem -out CA1.crt -days 365
其實,使用"-x509"選項后,"-new"或"-newkey"將表示創建一個證書文件而不是一個證書請求文件。
(6).讓openssl req自動創建所需的私鑰文件。
在前面的所有例子中,在需要私鑰的時候都明確使用了"-key"選項提供私鑰。其實如果不提供,openssl req會在任何需要私鑰的地方自動創建私鑰,並保存在特定的位置,默認的保存位置為當前目錄,文件名為privkey.pem,具體保存的位置和文件名由配置文件(默認為/etc/pki/tls/openssl.cnf)決定,此處不討論該文件。當然,openssl req命令的"-keyout"選項可以指定私鑰保存位置。
例如:
[root@xuexi tmp]# openssl req -new -out req3.csr Generating a 2048 bit RSA private key # 自動創建私鑰 ..................+++ .....................................+++ writing new private key to 'privkey.pem' Enter PEM pass phrase: # 要求輸入加密私鑰文件的密碼,且要求長度為4-1024個字符 Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:^C
但是,openssl req在自動創建私鑰時,將總是加密該私鑰文件,並提示輸入加密的密碼。可以使用"-nodes"選項禁止加密私鑰文件。
[root@xuexi tmp]# openssl req -new -out req3.csr -nodes Generating a 2048 bit RSA private key .............+++ .............................................................................+++ writing new private key to 'privkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:^C
指定自動創建私鑰時,私鑰文件的保存位置和文件名。使用"-keyout"選項。
[root@xuexi tmp]# openssl req -new -out req3.csr -nodes -keyout myprivkey.pem Generating a 2048 bit RSA private key ......................+++ ............................................................+++ writing new private key to 'myprivkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:^C
(7).使用"-newkey"選項。
"-newkey"選項和"-new"選項類似,只不過"-newkey"選項可以直接指定私鑰的算法和長度,所以它主要用在openssl req自動創建私鑰時。
它的使用格式為"-newkey arg",其中arg的格式為"rsa:numbits",rsa表示創建rsa私鑰,numbits表示私鑰的長度,如果不給定長度(即"-newkey rsa")則默認從配置文件中讀取長度值。其實不止支持rsa私鑰,只不過現在基本都是用rsa私鑰,所以默認就使用rsa。
[root@xuexi tmp]# openssl req -newkey rsa:2048 -out req3.csr -nodes -keyout myprivkey.pem Generating a 2048 bit RSA private key ....+++ .......................................................+++ writing new private key to 'myprivkey.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [XX]:^C
通過上面一系類的舉例說明后,想必openssl req的各基本選項的用法都通了。從上面的示例中也發現了,openssl req經常會依賴於配置文件(默認為/etc/pki/tls/openssl.cnf)中的值。所以,先將openssl req的命令用法總結下,再簡單說明下配置文件中和req有關的內容。
openssl req [-new] [-newkey rsa:bits] [-verify] [-x509] [-in filename] [-out filename] [-key filename] [-passin arg] [-passout arg]
[-keyout filename] [-pubkey] [-nodes] [-[dgst]] [-config filename] [-subj arg] [-days n] [-set_serial n] [-extensions section]
[-reqexts section] [-utf8] [-nameopt] [-reqopt] [-subject] [-subj arg] [-text] [-noout] [-batch] [-verbose] 選項說明: -new :創建一個證書請求文件,會交互式提醒輸入一些信息,這些交互選項以及交互選項信息的長度值以及其他一些擴展屬性在配置文件(默認為 :openssl.cnf,還有些輔助配置文件)中指定了默認值。如果沒有指定"-key"選項,則會自動生成一個RSA私鑰,該私鑰的生成位置 :也在openssl.cnf中指定了。如果指定了-x509選項,則表示創建的是自簽署證書文件,而非證書請求文件 -newkey args:類似於"-new"選項,創建一個新的證書請求,並創建私鑰。args的格式是"rsa:bits"(其他加密算法請查看man),其中bits :是rsa密鑰的長度,如果bits省略了(即-newkey rsa),則長度根據配置文件中default_bits指令的值作為默認長度,默認該值為2048 :如果指定了-x509選項,則表示創建的是自簽署證書文件,而非證書請求文件 -nodes :默認情況下,openssl req自動創建私鑰時都要求加密並提示輸入加密密碼,指定該選項后則禁止對私鑰文件加密 -key filename :指定私鑰的輸入文件,創建證書請求時需要 -keyout filename :指定自動創建私鑰時私鑰的存放位置,若未指定該選項,則使用配置文件中default_keyfile指定的值,默認該值為privkey.pem -[dgst] :指定對創建請求時提供的申請者信息進行數字簽名時的單向加密算法,如-md5/-sha1/-sha512等, :若未指定則默認使用配置文件中default_md指定的值 -verify :對證書請求文件進行數字簽名驗證 -x509 :指定該選項時,將生成一個自簽署證書,而不是創建證書請求。一般用於測試或者為根CA創建自簽名證書 -days n :指定自簽名證書的有效期限,默認30天,需要和"-x509"一起使用。 :注意是自簽名證書期限,而非請求的證書期限,因為證書的有效期是頒發者指定的,證書請求者指定有效期是沒有意義的, :配置文件中的default_days指定了請求證書的有效期限,默認365天 -set_serial n :指定生成自簽名證書時的證書序列號,該序列號將寫入配置文件中serial指定的文件中,這樣就不需要手動更新該序列號文件 :支持數值和16進制值(0x開頭),雖然也支持負數,但不建議 -in filename :指定證書請求文件filename。注意,創建證書請求文件時是不需要指定該選項的 -out filename :證書請求或自簽署證書的輸出文件,也可以是其他內容的輸出文件,不指定時默認stdout -subj args :替換或自定義證書請求時需要輸入的信息,並輸出修改后的請求信息。args的格式為"/type0=value0/type1=value1...", :如果value為空,則表示使用配置文件中指定的默認值,如果value值為".",則表示該項留空。其中可識別type(man req)有: :C是Country、ST是state、L是localcity、O是Organization、OU是Organization Unit、CN是common name等 【輸出內容選項:】 -text :以文本格式打印證書請求 -noout :不輸出部分信息 -subject :輸出證書請求文件中的subject(如果指定了x509,則打印證書中的subject) -pubkey :輸出證書請求文件中的公鑰 【配置文件項和雜項:】 -passin arg :傳遞解密密碼 -passout arg :指定加密輸出文件時的密碼 -config filename :指定req的配置文件,指定后將忽略所有的其他配置文件。如果不指定則默認使用/etc/pki/tls/openssl.cnf中req段落的值 -batch :非交互模式,直接從配置文件(默認/etc/pki/tls/openssl.cnf)中讀取證書請求所需字段信息。但若不指定"-key"時,仍會詢問key -verbose :顯示操作執行的詳細信息
以下則是配置文件中(默認/etc/pki/tls/openssl.cnf)關於req段落的配置格式。
input_password :密碼輸入文件,和命令行的"-passin"選項對應,密碼格式以及意義見"openssl密碼格式" output_password:密碼的輸出文件,與命令行的"-passout"選項對應,密碼格式以及意義見"openssl密碼格式" default_bits :openssl req自動生成RSA私鑰時的長度,不寫時默認是512,命令行的"-new"和"-newkey"可能會用到它 default_keyfile:默認的私鑰輸出文件,與命令行的"-keyout"選項對應 encrypt_key :當設置為no時,自動創建私鑰時不會加密該私鑰。設置為no時與命令行的"-nodes"等價。還有等價的兼容性寫法:encry_rsa_key default_md :指定創建證書請求時對申請者信息進行數字簽名的單向加密算法,與命令行的"-[dgst]"對應 prompt :當指定為no時,則不提示輸入證書請求的字段信息,而是直接從openssl.cnf中讀取 :請小心設置該選項,很可能請求文件創建失敗就是因為該選項設置為no distinguished_name:(DN)是一個擴展屬性段落,用於指定證書請求時可被識別的字段名稱。
以下是默認的配置文件格式及值。關於配置文件的詳細分析見"配置文件"部分。
[ req ] default_bits = 2048 default_md = sha1 default_keyfile = privkey.pem distinguished_name = req_distinguished_name attributes = req_attributes x509_extensions = v3_ca # The extentions to add to the self signed cert string_mask = utf8only [ req_distinguished_name ] countryName = Country Name (2 letter code) countryName_default = XX countryName_min = 2 countryName_max = 2 stateOrProvinceName = State or Province Name (full name) localityName = Locality Name (eg, city) localityName_default = Default City 0.organizationName = Organization Name (eg, company) 0.organizationName_default = Default Company Ltd organizationalUnitName = Organizational Unit Name (eg, section) commonName = Common Name (eg, your name or your server\'s hostname) commonName_max = 64 emailAddress = Email Address emailAddress_max = 64