天天看點

建立你自己的 CA 服務:OpenSSL 指令行 CA 操作快速指南建立你自己的 CA 服務:OpenSSL 指令行 CA 操作快速指南

這些是關于使用 openssl 生成證書授權(ca)、中間證書授權和末端證書的速記随筆,内容包括 ocsp、crl 和 ca 頒發者資訊,以及指定頒發和有效期限等。

我們将建立我們自己的根 ca,我們将使用根 ca 來生成一個中間 ca 的例子,我們将使用中間 ca 來簽署末端使用者證書。

建立你自己的 CA 服務:OpenSSL 指令行 CA 操作快速指南建立你自己的 CA 服務:OpenSSL 指令行 CA 操作快速指南

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

建立根 ca 授權目錄并切換到該目錄:

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

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

為我們的根 ca 生成一個8192位長的 sha-256 rsa 密鑰:

<code>openssl genrsa -aes256 -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> 選項。

建立自簽名根 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]:nl</code>

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

<code>locality name (eg, city) []:rotterdam</code>

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

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

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

<code>email address []:</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 = sparkling intermidiate ca 1</code>

<code>dns.1 = sparkling ca intermidiate 1</code>

<code>[crl_section]</code>

<code>uri.0 = http://pki.sparklingca.com/sparklingroot.crl</code>

<code>uri.1 = http://pki.backup.com/sparklingroot.crl</code>

<code>[ocsp_section]</code>

<code>caissuers;uri.0 = http://pki.sparklingca.com/sparklingroot.crt</code>

<code>caissuers;uri.1 = http://pki.backup.com/sparklingroot.crt</code>

<code>ocsp;uri.0 = http://pki.sparklingca.com/ocsp/</code>

<code>ocsp;uri.1 = http://pki.backup.com/ocsp/</code>

如果你需要設定某個特定的證書生效/過期日期,請添加以下内容到<code>[myca]</code>:

<code># format: yyyymmddhhmmss</code>

<code>default_enddate = 20191222035911</code>

<code>default_startdate = 20181222035911</code>

生成中間 ca (名為 intermediate1)的私鑰:

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

生成中間 ca 的 csr:

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

<code>common name (e.g. server fqdn or your name) []:sparkling intermediate ca</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)和根 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:'nl'</code>

<code>stateorprovincename :asn.1 12:'zuid holland'</code>

<code>localityname :asn.1 12:'rotterdam'</code>

<code>organizationname :asn.1 12:'sparkling network'</code>

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

<code>commonname :asn.1 12:'sparkling 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。

如果你需要撤銷該中間證書:

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

為該中間 ca 建立一個新檔案夾,然後進入該檔案夾:

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

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

從根 ca 拷貝中間證書和密鑰:

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

<code>cp ~/sslca/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 = example.com</code>

<code>dns.1 = example.org</code>

<code>uri.0 = http://pki.sparklingca.com/sparklingintermidiate1.crl</code>

<code>uri.1 = http://pki.backup.com/sparklingintermidiate1.crl</code>

<code>caissuers;uri.0 = http://pki.sparklingca.com/sparklingintermediate1.crt</code>

<code>caissuers;uri.1 = http://pki.backup.com/sparklingintermediate1.crt</code>

修改 <code>[alt_names]</code> 部分,添加你需要的主體備選名。如果你不需要主體備選名,請移除該部分包括<code>subjectaltname = @alt_names</code>的行。

如果你需要設定一個指定的生效/到期日期,請添加以下内容到 <code>[myca]</code>:

生成一個空白 crl(同時以 pem 和 der 格式):

我們使用這個新的中間 ca 來生成一個末端使用者證書,請重複以下操作來使用該 ca 為每個使用者簽署。

<code>mkdir enduser-certs</code>

生成末端使用者的私鑰:

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

生成末端使用者的 csr:

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

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

<code>locality name (eg, city) []:amsterdam</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>

使用中間 ca 簽署末端使用者的 csr:

<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:'noord holland'</code>

<code>localityname :asn.1 12:'amsterdam'</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 格式):

<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 簽署證書後,都需要生成 crl。

如果你需要撤銷該末端使用者證書:

<code>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,而隻發送給他們這個 .crt 檔案。不要把它從伺服器删除,否則你就不能撤銷了。

你可以對證書鍊使用以下指令來驗證末端使用者證書:

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

<code>enduser-certs/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-certs/enduser-example.com.crl.chain enduser-certs/enduser-example.com.crt</code>

沒有撤銷時的輸出:

撤銷後的輸出如下:

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

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

原文釋出時間:2015-05-14

本文來自雲栖合作夥伴“linux中國”

繼續閱讀