openssl系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.htmlhtml
自建CA的機制:1.生成私鑰;2.建立證書請求;3.使用私鑰對證書請求籤名。vim
因爲測試環境,因此自建的CA只能是根CA。所使用的配置文件以下。dom
[default] name = root-ca /* 變量*/ default_ca = CA_default name_opt = ca_default cert_opt = ca_default [CA_default] home = . /* 變量*/ database = $home/db/index serial = $home/db/serial crlnumber = $home/db/crlnumber certificate = $home/$name.crt private_key = $home/private/$name.key RANDFILE = $home/private/random new_certs_dir = $home/certs unique_subject = no copy_extensions = none default_days = 3650 default_crl_days = 365 default_md = sha256 policy = policy_to_match [policy_to_match] countryName = match stateOrProvinceName = optional organizationName = match organizationalUnitName = optional commonName = supplied emailAddress = optional [CA_DN] countryName = "C" contryName_default = "CN" organizationName = "O" organizationName_default = "jmu" commonName = "CN" commonName_default = "longshuai.com" [req] default_bits = 4096 encrypt_key = no default_md = sha256 utf8 = yes string_mask = utf8only # prompt = no /* 測試時該選項致使出錯,因此將其註釋掉*/ distinguished_name = CA_DN req_extensions = ca_ext [ca_ext] basicConstraints = critical,CA:true keyUsage = critical,keyCertSign,cRLSign subjectKeyIdentifier = hash
[root@xuexi ~]# mkdir /ssl;touch /ssl/ssl.conf [root@xuexi ~]# cd /ssl [root@xuexi ssl]# vim ssl.conf
[root@xuexi ssl]# mkdir /ssl/{db,private,certs} [root@xuexi ssl]# chmod -R 400 private/
普通的證書請求須要使用CA的私鑰進行簽名變成證書,既然是自簽名證書那固然是使用本身的私鑰來簽名。能夠使用僞命令req、ca、x509來自簽名。測試
這裏有兩種方法:1.一步完成,即私鑰、證書請求、自簽名都在一個命令中完成2.分步完成,先生成私鑰、再建立證書請求、再指定私鑰來簽名。方法2中其實生成私鑰和證書申請能夠合併在一步中完成,證書申請和簽名也能夠合併在一步中完成。ui
方法一:一步完成加密
在下面的一步命令中,使用-new因爲沒有指定私鑰輸出位置,因此自動保存在ssl.conf中default_keyfile指定的private.pem中;因爲ssl.conf中的req段設置了encrypt_key=no,因此交互時不須要輸入私鑰的加密密碼;因爲使用req -x509自簽名的證書有效期默認爲30天,而配置文件中req段又不能配置該期限,因此只能使用-days來指定有效期限,注意這個-days選項只做用於x509簽名,證書請求中若是指定了時間是無效的。spa
[root@xuexi ssl]# openssl req -x509 -new -out req.crt -config ssl.conf -days 365 [root@xuexi ssl]# ll total 24 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem /* 注意權限爲644 */ -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 02:52:24 2016 GMT notAfter=Nov 22 02:52:24 2017 GMT
方法二:分步完成,這裏把各類可能的步驟合併都演示一遍code
>>建立私鑰和證書請求合併而簽名獨自進行的方法<<htm
[root@xuexi ssl]# openssl req -newkey rsa:1024 -keyout key.pem -out req1.csr -config ssl.conf -days 365 [root@xuexi ssl]# openssl req -x509 -in req1.csr -key key.pem -out req1.crt [root@xuexi ssl]# openssl x509 -noout -dates -in req1.crt/* 注意簽名不要配置文件 */ notBefore=Nov 22 02:58:25 2016 GMT notAfter=Dec 22 02:58:25 2016 GMT /* 能夠看到證書請求中指定-days是無效的 */ [root@xuexi ssl]# ll total 36 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>獨自生成私鑰,而請求和簽名合併的方法<<blog
[root@xuexi ssl]# (umask 077;openssl genrsa -out key1.pem 1024) [root@xuexi ssl]# openssl req -x509 -new -key key1.pem -out req2.crt -config ssl.conf -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req2.crt notBefore=Nov 22 03:28:31 2016 GMT notAfter=Nov 22 03:28:31 2017 GMT [root@xuexi ssl]# ll total 44 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw-r--r-- 1 root root 912 Nov 22 10:57 key1.pem -rw------- 1 root root 887 Nov 22 11:26 key2.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 3272 Nov 22 10:52 private.pem -rw-r--r-- 1 root root 826 Nov 22 10:58 req1.crt -rw-r--r-- 1 root root 688 Nov 22 10:57 req1.csr -rw-r--r-- 1 root root 709 Nov 22 11:28 req2.crt -rw-r--r-- 1 root root 1753 Nov 22 10:52 req.crt -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
>>徹底分步進行<<
[root@xuexi ssl]# rm -rf key* req* private.pem [root@xuexi ssl]# (umask 077;openssl genrsa -out key.pem 1024) [root@xuexi ssl]# openssl req -new -key key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl req -x509 -key key.pem -in req.csr -out req.crt -days 365 [root@xuexi ssl]# openssl x509 -noout -dates -in req.crt notBefore=Nov 22 04:29:21 2016 GMT notAfter=Nov 22 04:29:21 2017 GMT [root@xuexi ssl]# ll total 28 drwxr-xr-x 2 root root 4096 Nov 22 09:05 certs drwxr-xr-x 2 root root 4096 Nov 22 09:05 db -rw------- 1 root root 887 Nov 22 12:28 key.pem drwx------ 2 root root 4096 Nov 22 09:05 private -rw-r--r-- 1 root root 826 Nov 22 12:29 req.crt -rw-r--r-- 1 root root 688 Nov 22 12:28 req.csr -rw-r--r-- 1 root root 1580 Nov 22 10:51 ssl.conf
在本節的開頭說明了建立證書請求時須要提供私鑰,這個私鑰的做用是爲了提供公鑰。下面是驗證。
/* 提取私鑰key.pem中的公鑰到key.pub文件中 */ [root@xuexi ssl]# openssl rsa -in key.pem -pubout -out key.pub /* 輸出證書請求req.csr中的公鑰部分 */ [root@xuexi ssl]# openssl req -noout -pubkey -in req.csr -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY----- /* 查看key.pub,能夠發現和req.csr中的公鑰是同樣的 */ [root@xuexi ssl]# cat key.pub -----BEGIN PUBLIC KEY----- MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC+YBneLYbh+OZWpiyPqIQHOsU5 D8il6UF7hi3NgEX/6vtciSmp7GXpXUV1tDglCCTPOfCHcEzeO0Gvky21LUenDsl/ aC2lraSijpl41+rT4mKNrCyDPZw4iG44+vLHfgHb3wJhBbBk0aw51dmxUat8FHCL hU7nx+Du637UDlwdEQIDAQAB -----END PUBLIC KEY-----
雖然建立證書請求時使用的是公鑰,可是卻不能使用-key選項指定公鑰,而是隻能指定私鑰,由於req -new或-newkey選項會調用openssl rsa命令來提取公鑰,指定公鑰該調用將執行失敗。
使用x509僞命令須要提供請求文件,所以須要先建立證書請求文件。因爲x509僞命令簽名時不讀取配置文件,因此不須要設置配置文件,若須要某選項,只需使用x509中對應的選項來達成便可。
如下x509 -req用於自簽名,須要-signkey提供簽名所需私鑰key.pem。
[root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl x509 -req -in req.csr -signkey key.pem -out x509.crt
使用ca僞命令自簽名會讀取配置文件中的ca部分,因此配置文件中所需的目錄和文件結構都須要建立好,包括目錄db、private、certs,文件db/index、db/serial,並向serial中寫入一個序列號。因爲是自簽名,能夠自行指定私鑰文件,所以對於簽名所需CA私鑰文件無需放置在private目錄中。
[root@xuexi ssl]# touch db/{serial,index} [root@xuexi ssl]# echo "01" > db/serial [root@xuexi ssl]# openssl req -new -keyout key.pem -out req.csr -config ssl.conf [root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf
在此簽名過程當中有兩次詢問,以下:
Certificate is to be certified until Nov 20 06:34:41 2026 GMT (3650 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
若要無交互,則使用-batch進入批處理模式。
[root@xuexi ssl]# openssl ca -selfsign -keyfile key.pem -in req.csr -config ssl.conf -batch
CA爲其餘請求或證書籤名時,須要使用到的文件有:本身的CA證書和本身的私鑰文件。所以簽名過程當中須要提供這兩個文件。
使用ca僞命令自建根CA後,目錄結構以下:
[root@xuexi ssl]# tree -R -C . ├── certs │ └── 01.pem ├── db │ ├── index │ ├── index.attr │ ├── index.old │ ├── serial │ └── serial.old ├── key.pem ├── private ├── req.csr └── ssl.conf
其中01.pem是根CA證書,key.pem是根CA私鑰。
如今要爲其餘證書請求籤名,首先建立其餘請求吧,假設該請求文件/tmp/req.csr。
[root@xuexi ssl]# openssl req -new -keyout /tmp/key.pem -out /tmp/req.csr -config ssl.conf
使用根證書01.pem爲/tmp/req.csr簽名。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -keyfile key.pem -cert certs/01.pem -config ssl.conf -batch
這樣挺麻煩,由於每次爲別人簽名時都要指定-cert和-keyfile,能夠將CA的證書和CA的私鑰移動到配置文件中指定的路徑下:
certificate = $home/$name.crt private_key = $home/private/$name.key |
[root@xuexi ssl]# mv certs/01.pem root-ca.crt [root@xuexi ssl]# mv key.pem private/root-ca.key
再使用ca簽名時將能夠使用默認值。
[root@xuexi ssl]# openssl ca -in /tmp/req.csr -config ssl.conf -batch
如今根CA證書爲root-ca.crt,CA的私鑰爲private/root-ca.key。
下面使用x509僞命令實現簽名。因爲x509不會讀取配置文件,因此須要提供簽名的序列號,使用-CAcreateserial能夠在沒有序列號文件時自動建立;因爲x509默認-in指定的輸入文件是證書文件,因此要對請求文件簽名,須要使用-req來表示輸入文件爲請求文件。
[root@xuexi ssl]# openssl x509 -req -in /tmp/req.csr -CA root-ca.crt -CAkey private/root-ca.key -out x509.crt -CAcreateserial
這是推薦採用的方法,由於方便管理,但使用默認配置文件,須要進行一些初始化動做。
因爲徹底採用/etc/pki/tls/openssl.cnf的配置,因此要創建相關文件。
自建CA的過程:
[root@xuexi tmp]# touch /etc/pki/CA/index.txt [root@xuexi tmp]# echo "01" > /etc/pki/CA/serial [root@xuexi tmp]# openssl genrsa -out /etc/pki/CA/private/cakey.pem # 建立CA的私鑰 [root@xuexi tmp]# openssl req -new -key /etc/pki/CA/private/cakey.pem -out rootCA.csr # 建立CA待自簽署的證書請求文件 [root@xuexi tmp]# openssl ca -selfsign -in rootCA.csr # 自簽署 [root@xuexi tmp]# cp /etc/pki/CA/newcerts/01.pem /etc/pki/CA/cacert.pem # 將自簽署的證書按照配置文件的配置複製到指定位置
爲他人頒發證書的過程:
[root@xuexi tmp]# openssl ca -in youwant1.csr
簽署成功後,證書位於/etc/pki/CA/newcert目錄下,將新生成的證書文件發送給申請者便可。