OpenSSL 創(chuàng)建私有 CA 三部曲: OpenSSL 是一個免費(fèi)開源的庫,它提供了一些處理數(shù)字證書的命令行工具。其中一些工具可以用作證書頒發(fā)機(jī)構(gòu)(Certificate Authority 即 CA)。 基本目錄結(jié)構(gòu)創(chuàng)建 myca 目錄保存 CA 相關(guān)的所有內(nèi)容,然后創(chuàng)建 myca/rootca 目錄用來保存根證書相關(guān)的內(nèi)容: 至于上圖中的 myca/powerca 和 myca/usercert 則存放后面要介紹的中間證書和用戶證書的內(nèi)容。 準(zhǔn)備根證書的配置文件OpenSSL 程序提供了一個默認(rèn)的配置文件:/etc/ssl/openssl.cnf,但是由于我們自定義的內(nèi)容比較多,所以干脆創(chuàng)建一個套單獨(dú)的配置文件。創(chuàng)建文件 rootca/rootca.cnf,編輯其內(nèi)容如下: # OpenSSL root CA configuration file. # v1 [ ca ] # `man ca` default_ca = CA_default [ CA_default ] # Directory and file locations. dir = /home/nick/projects/myca/rootca certs = $dir/certs crl_dir = $dir/crl new_certs_dir = $dir/newcerts database = $dir/db/index serial = $dir/db/serial RANDFILE = $dir/private/random # The root key and root certificate. private_key = $dir/private/rootca.key.pem certificate = $dir/certs/rootca.cert.pem # For certificate revocation lists. crlnumber = $dir/db/crlnumber crl = $dir/crl/rootca.crl.pem crl_extensions = crl_ext default_crl_days = 30 # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 name_opt = ca_default cert_opt = ca_default default_days = 3750 preserve = no policy = policy_strict [ policy_strict ] # The root CA should only sign intermediate certificates that match. # See the POLICY FORMAT section of `man ca`. countryName = match stateOrProvinceName = match organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [ req ] # Options for the `req` tool (`man req`). # Optionally, specify some defaults. prompt = no input_password = 123456 default_bits = 2048 distinguished_name = req_distinguished_name string_mask = utf8only # SHA-1 is deprecated, so use SHA-2 instead. default_md = sha256 # Extension to add when the -x509 option is used. # make sure use x509_extensions, do not use req_extensions. x509_extensions = v3_ca # use the req_extensions not work. #req_extensions = v3_ca [ req_distinguished_name ] # See <https://en./wiki/Certificate_signing_request>. countryName = CN stateOrProvinceName = ShaanXi localityName = Xian organizationName = NickLi Ltd organizationalUnitName = NickLi Ltd CA commonName = NickLi Root CA emailAddress = ljfpower@163.com [ v3_ca ] # Extensions for a typical CA (`man x509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ v3_intermediate_ca ] # Extensions for a typical intermediate CA (`man x509v3_config`). subjectKeyIdentifier = hash authorityKeyIdentifier = keyid:always,issuer basicConstraints = critical, CA:true, pathlen:0 keyUsage = critical, digitalSignature, cRLSign, keyCertSign [ crl_ext ] # Extension for CRLs (`man x509v3_config`). authorityKeyIdentifier=keyid:always [ ocsp ] # Extension for OCSP signing certificates (`man ocsp`). basicConstraints = CA:FALSE subjectKeyIdentifier = hash authorityKeyIdentifier = keyid,issuer keyUsage = critical, digitalSignature extendedKeyUsage = critical, OCSPSigning 這是一個非常重要的配置文件,指定了很多配置的目錄,其中最重要的一個已經(jīng)被抽取成了變量 dir。我們要做的就是指定 dir 的路徑,并且根據(jù)下面的步驟來創(chuàng)建其余的目錄和文件。 [ req ] prompt = no input_password = 123456 其中的 123456 就是后面創(chuàng)建的秘鑰的密碼,這樣在創(chuàng)建 Certificate Signing Requests(csr) 時就不需要以交互的方式輸入密碼了。 [ req_distinguished_name ] countryName = CN stateOrProvinceName = ShaanXi localityName = Xian organizationName = NickLi Ltd organizationalUnitName = NickLi Ltd CA commonName = NickLi Root CA emailAddress = ljfpower@163.com 準(zhǔn)備目錄和文件在 rootca 目錄下創(chuàng)建下面的目錄和文件: rootca/certs/ # 存放新建的證書 rootca/db/ # spenssl 用來存放信息的目錄 rootca/private/ # 存放私鑰 rootca/crl/ rootca/newcerts/ rootca/db/index rootca/db/serial rootca/db/crlnumber 其中的 rootca/private 目錄需要 700 的權(quán)限,主要是為了既保證私鑰的安全有能夠創(chuàng)建私鑰文件。rootca/db/serial 和 rootca/db/crlnumber 則需要被初始化為特定的值。簡單起見我們可以使用下面的腳本來創(chuàng)建這些目錄和文件: #!/bin/bash # create dir certs db private crl newcerts under rootca dir. if [ ! -d rootca/certs ]; then mkdir -p rootca/certs fi if [ ! -d rootca/db ]; then mkdir -p rootca/db touch rootca/db/index openssl rand -hex 16 > rootca/db/serial echo 1001 > rootca/db/crlnumber fi if [ ! -d rootca/private ]; then mkdir -p rootca/private chmod 700 rootca/private fi if [ ! -d rootca/crl ]; then mkdir -p rootca/crl fi if [ ! -d rootca/newcerts ]; then mkdir -p rootca/newcerts fi 把上面的代碼保存到 myca/roothelpler.sh 文件中,然后 cd 到 myca 目錄下執(zhí)行: $ ./roothelpler.sh 此時當(dāng)前目錄為 myca,rootca 下的子目錄和文件都已經(jīng)創(chuàng)建成功。 創(chuàng)建 root 秘鑰進(jìn)入 rootca 目錄: $ cd rootca 執(zhí)行下面的命令創(chuàng)建私鑰: $ openssl genrsa -aes256 -out private/rootca.key.pem 4096 這里筆者設(shè)置的密碼為:123456,記住這個密碼,后面還會用到。然后為了確保安全,把秘鑰的訪問權(quán)限設(shè)置為 400: $ chmod 400 private/rootca.key.pem 此時當(dāng)前目錄為 myca/rootca。 創(chuàng)建 Certificate Signing Requests(csr)執(zhí)行下面的命令創(chuàng)建 csr: $ openssl req -new -config rootca.cnf -sha256 -key private/rootca.key.pem -out csr/rootca.csr.pem 下面的命令可以檢查生成的 csr: $ openssl req -text -noout -in csr/rootca.csr.pem 注意,csr 中包含了 CA 的基本信息,和公鑰信息。 創(chuàng)建 CA 的根證書有了前一步中生成的 csr,我們就可以通過下面的命令生成 CA 的根證書了: $ openssl ca -selfsign -config rootca.cnf -in csr/rootca.csr.pem -extensions v3_ca -days 7300 -out certs/rootca.cert.pem 在交互式的提示中輸入私鑰的密碼 123456,并同意其它的確認(rèn)提示,就完成了根證書的生成操作。注意,上面命令中的 -selfsing 選項(xiàng),它說明所有的根證書都是自簽名的。同樣,我們也可以通過命令來查看證書的詳細(xì)信息: $ openssl x509 -noout -text -in certs/rootca.cert.pem 其中的 Signature Algorithm 為簽名算法;Issurer 是簽發(fā)方,即簽署證書的實(shí)體;Validity 指明證書的有效期為 2018-11-26 號至 2038-11-21 號;然后是公鑰信息;Subject 指明證書自身的信息,這里 Issurer 和 Subject 的信息是一樣的;下面還有 X509 協(xié)議相關(guān)的信息,這部分信息由配置文件 rootca.cnf 中的 [ v3_ca ] 段控制: 紅框中的信息表明這個證書被用作 CA。 總結(jié)至此我們已經(jīng)為私有的 CA 創(chuàng)建了根證書,在接下來的《使用 OpenSSL 創(chuàng)建私有 CA:中間證書》一文中我們將詳細(xì)的介紹如何創(chuàng)建 CA 的中間證書。 參考: |
|