天天看點

使用 openssl 指令行建構 CA 及證書

這是一篇快速指南,使用 openssl 來生成 ca (證書授權中心certificate authority)、 中級 caintermediate ca 和末端證書end certificate。包括 ocsp、crl 和 ca 頒發者issuer資訊、具體頒發和失效日期。

我們将設定我們自己的根 caroot ca,然後使用根 ca 生成一個示例的中級 ca,并使用中級 ca 簽發最終使用者證書。

使用 openssl 指令行建構 CA 及證書

為根 ca 建立一個目錄,并進入:

<code>mkdir -p ~/sslca/root/</code>

<code>cd ~/sslca/root/</code>

生成根 ca 的 8192 位長的 rsa 密鑰:

<code>openssl genrsa -out rootca.key 8192</code>

輸出類似如下:

<code>generating rsa private key, 8192 bit long modulus</code>

<code>.........++</code>

<code>....................................................................................................................++</code>

<code>e is 65537 (0x10001)</code>

如果你要用密碼保護這個密鑰,在指令行添加選項 <code>-aes256</code>。

建立 sha-256 自簽名的根 ca 證書 <code>ca.crt</code>;你需要為你的根 ca 提供識别資訊:

<code>openssl req -sha256 -new -x509 -days 1826 -key rootca.key -out rootca.crt</code>

<code>you are about to be asked to enter information that will be incorporated</code>

<code>into your certificate request.</code>

<code>what you are about to enter is what is called a distinguished name or a dn.</code>

<code>there are quite a few fields but you can leave some blank</code>

<code>for some fields there will be a default value,</code>

<code>if you enter '.', the field will be left blank.</code>

<code>-----</code>

<code>country name (2 letter code) [au]:cn</code>

<code>state or province name (full name) [some-state]:beijing</code>

<code>locality name (eg, city) []:chaoyang dist.</code>

<code>organization name (eg, company) [internet widgits pty ltd]:linux.cn</code>

<code>organizational unit name (eg, section) []:linux.cn ca</code>

<code>common name (e.g. server fqdn or your name) []:linux.cn root ca</code>

<code>email address []:[email protected]</code>

建立幾個檔案, 用于該 ca 存儲其序列号:

<code>touch certindex</code>

<code>echo 1000 &gt; certserial</code>

<code>echo 1000 &gt; crlnumber</code>

建立 ca 的配置檔案,該檔案包含 crl 和 ocsp 終端的存根。

<code># vim ca.conf</code>

<code>[ ca ]</code>

<code>default_ca = myca</code>

<code></code>

<code>[ crl_ext ]</code>

<code>issueraltname=issuer:copy</code>

<code>authoritykeyidentifier=keyid:always</code>

<code>[ myca ]</code>

<code>dir = ./</code>

<code>new_certs_dir = $dir</code>

<code>unique_subject = no</code>

<code>certificate = $dir/rootca.crt</code>

<code>database = $dir/certindex</code>

<code>private_key = $dir/rootca.key</code>

<code>serial = $dir/certserial</code>

<code>default_days = 730</code>

<code>default_md = sha1</code>

<code>policy = myca_policy</code>

<code>x509_extensions = myca_extensions</code>

<code>crlnumber = $dir/crlnumber</code>

<code>default_crl_days = 730</code>

<code>[ myca_policy ]</code>

<code>commonname = supplied</code>

<code>stateorprovincename = supplied</code>

<code>countryname = optional</code>

<code>emailaddress = optional</code>

<code>organizationname = supplied</code>

<code>organizationalunitname = optional</code>

<code>[ myca_extensions ]</code>

<code>basicconstraints = critical,ca:true</code>

<code>keyusage = critical,any</code>

<code>subjectkeyidentifier = hash</code>

<code>authoritykeyidentifier = keyid:always,issuer</code>

<code>keyusage = digitalsignature,keyencipherment,crlsign,keycertsign</code>

<code>extendedkeyusage = serverauth</code>

<code>crldistributionpoints = @crl_section</code>

<code>subjectaltname = @alt_names</code>

<code>authorityinfoaccess = @ocsp_section</code>

<code>[ v3_ca ]</code>

<code>basicconstraints = critical,ca:true,pathlen:0</code>

<code>[ alt_names ]</code>

<code>dns.0 = linux.cn root ca</code>

<code>dns.1 = linux.cn ca root</code>

<code>[crl_section]</code>

<code>uri.0 = http://pki.linux.cn/rootca.crl</code>

<code>uri.1 = http://pki2.linux.cn/rootca.crl</code>

<code>[ ocsp_section ]</code>

<code>caissuers;uri.0 = http://pki.linux.cn/rootca.crt</code>

<code>caissuers;uri.1 = http://pki2.linux.cn/rootca.crt</code>

<code>ocsp;uri.0 = http://pki.linux.cn/ocsp/</code>

<code>ocsp;uri.1 = http://pki2.linux.cn/ocsp/</code>

如果你要設定一個特定的證書起止時間,添加下述内容到 <code>[myca]</code>。

<code># format: yyyymmddhhmmss</code>

<code>default_enddate = 20191222035911</code>

<code>default_startdate = 20181222035911</code>

生成中級 ca 的私鑰

<code>openssl genrsa -out intermediate1.key 4096</code>

生成其 csr:

<code>openssl req -new -sha256 -key intermediate1.key -out intermediate1.csr</code>

<code>common name (e.g. server fqdn or your name) []:linux.cn intermediate ca</code>

<code>email address []:</code>

<code>please enter the following 'extra' attributes</code>

<code>to be sent with your certificate request</code>

<code>a challenge password []:</code>

<code>an optional company name []:</code>

請確定中級 ca 的主題名(cn,common name)和根 ca 的不同。

使用根 ca 為你建立的中級 ca 的 csr 簽名:

<code>openssl ca -batch -config ca.conf -notext -in intermediate1.csr -out intermediate1.crt</code>

<code>using configuration from ca.conf</code>

<code>check that the request matches the signature</code>

<code>signature ok</code>

<code>the subject's distinguished name is as follows</code>

<code>countryname :printable:'cn'</code>

<code>stateorprovincename :asn.1 12:'beijing'</code>

<code>localityname :asn.1 12:'chaoyang dist.'</code>

<code>organizationname :asn.1 12:'linux.cn'</code>

<code>organizationalunitname:asn.1 12:'linux.cn ca'</code>

<code>commonname :asn.1 12:'linux.cn intermediate ca'</code>

<code>certificate is to be certified until mar 30 15:07:43 2017 gmt (730 days)</code>

<code>write out database with 1 new entries</code>

<code>data base updated</code>

生成 crl  (包括 pem 和 der 兩種格式):

<code>openssl ca -config ca.conf -gencrl -keyfile rootca.key -cert rootca.crt -out rootca.crl.pem</code>

<code>openssl crl -inform pem -in rootca.crl.pem -outform der -out rootca.crl</code>

每次使用該 ca 簽名證書後都需要生成 crl。

如果需要的話,你可以撤銷revoke這個中級證書:

<code>openssl ca -config ca.conf -revoke intermediate1.crt -keyfile rootca.key -cert rootca.crt</code>

<a target="_blank"></a>

給該中級 ca 建立新目錄,并進入:

<code>mkdir ~/sslca/intermediate1/</code>

<code>cd ~/sslca/intermediate1/</code>

從根 ca 那邊複制這個中級 ca 的證書和私鑰:

<code>cp ../root/intermediate1.key ./</code>

<code>cp ../root/intermediate1.crt ./</code>

建立索引檔案:

建立一個新的 <code>ca.conf</code> :

<code>certificate = $dir/intermediate1.crt</code>

<code>private_key = $dir/intermediate1.key</code>

<code>default_days = 365</code>

<code>default_crl_days = 365</code>

<code>basicconstraints = critical,ca:false</code>

<code>keyusage = digitalsignature,keyencipherment</code>

<code>dns.0 = linux.cn intermidiate ca 1</code>

<code>dns.1 = linux.cn ca intermidiate 1</code>

<code>[ crl_section ]</code>

<code>uri.0 = http://pki.linux.cn/intermediate1.crl</code>

<code>uri.1 = http://pki2.linux.cn/intermediate1.crl</code>

<code>caissuers;uri.0 = http://pki.linux.cn/intermediate1.crt</code>

<code>caissuers;uri.1 = http://pki2.linux.cn/intermediate1.crt</code>

修改 <code>[alt_names]</code> 小節為你所需的替代主題名subject alternative names。如果不需要就删除引入它的 <code>subjectaltname = @alt_names</code> 行。

如果你需要指定起止時間,添加如下行到 <code>[myca] </code>中。

生成一個空的 crl (包括 pem 和 der 兩種格式):

<code>openssl ca -config ca.conf -gencrl -keyfile intermediate1.key -cert intermediate1.crt -out intermediate1.crl.pem</code>

<code>openssl crl -inform pem -in intermediate1.crl.pem -outform der -out intermediate1.crl</code>

我們使用新的中級 ca 來生成最終使用者的證書。為每個你需要用此 ca 簽名的最終使用者證書重複這些步驟。

<code>mkdir ~/enduser-certs</code>

<code>cd ~/enduser-certs</code>

生成最終使用者的私鑰:

<code>openssl genrsa -out enduser-example.com.key 4096</code>

生成最終使用者的 csr:

<code>openssl req -new -sha256 -key enduser-example.com.key -out enduser-example.com.csr</code>

<code>state or province name (full name) [some-state]:shanghai</code>

<code>locality name (eg, city) []:xuhui dist.</code>

<code>organization name (eg, company) [internet widgits pty ltd]:example inc</code>

<code>organizational unit name (eg, section) []:it dept</code>

<code>common name (e.g. server fqdn or your name) []:example.com</code>

用1号中級 ca 簽名最終使用者的證書:

<code>cd ~/sslca/intermediate1</code>

<code>openssl ca -batch -config ca.conf -notext -in ~/enduser-certs/enduser-example.com.csr -out ~/enduser-certs/enduser-example.com.crt</code>

<code>stateorprovincename :asn.1 12:'shanghai'</code>

<code>localityname :asn.1 12:'xuhui dist.'</code>

<code>organizationname :asn.1 12:'example inc'</code>

<code>organizationalunitname:asn.1 12:'it dept'</code>

<code>commonname :asn.1 12:'example.com'</code>

<code>certificate is to be certified until mar 30 15:18:26 2016 gmt (365 days)</code>

生成 crl (包括 pem 和 der 兩種格式):

如果需要的話,你可以撤銷revoke這個最終使用者證書:

<code>cd ~/sslca/intermediate1/ openssl ca -config ca.conf -revoke ~/enduser-certs/enduser-example.com.crt -keyfile intermediate1.key -cert intermediate1.crt</code>

<code>revoking certificate 1000.</code>

将根證書和中級證書連接配接起來建立證書鍊檔案:

<code>cat ../root/rootca.crt intermediate1.crt &gt; ~/enduser-certs/enduser-example.com.chain</code>

将這些檔案發送給最終使用者:

<code>enduser-example.com.crt</code>

<code>enduser-example.com.key</code>

<code>enduser-example.com.chain</code>

你也可以讓最終使用者提供他們中級的 csr 檔案,而隻發回給他們 這個 <code>.crt</code> 檔案。不要從伺服器上删除它們,否則就不能撤銷了。

你可以通過如下指令使用證書鍊來驗證最終使用者證書:

<code>openssl verify -cafile enduser-example.com.chain enduser-example.com.crt</code>

<code>enduser-example.com.crt: ok</code>

你也可以用 crl 來校驗它。首先将 pem crl 連接配接到證書鍊檔案:

<code>cat ../root/rootca.crt intermediate1.crt intermediate1.crl.pem &gt; ~/enduser-certs/enduser-example.com.crl.chain</code>

校驗證書:

<code>openssl verify -crl_check -cafile enduser-example.com.crl.chain enduser-example.com.crt</code>

如果該證書未撤銷,輸出如下:

如果撤銷了,輸出如下:

<code>enduser-example.com.crt: cn = example.com, st = beijing, c = cn, o = example inc, ou = it dept</code>

<code>error 23 at 0 depth lookup:certificate revoked</code>

<code>本文來自雲栖社群合作夥伴“linux中國”,原文釋出日期:2015-10-28</code>

繼續閱讀