先把用到的命令行放上來方便備查:
如不需要私鑰密碼旋恼,則刪掉 -des3
參數(shù)即可
自簽名:
# 1.生成私鑰
$ openssl genrsa -out server.key 2048
# 2.生成 CSR (Certificate Signing Request)
$ openssl req \
-subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=test1.sslpoc.com/emailAddress=test@mochasoft.com.cn" \
-new \
-key server.key \
-out server.csr
# 3.生成自簽名證書
$ openssl x509 \
-req \
-days 3650 \
-in server.csr \
-signkey server.key \
-out server.crt
私有 CA 簽名:
# 1.創(chuàng)建 CA 私鑰
$ openssl genrsa -out ca.key 2048
# 2.生成 CA 的自簽名證書
$ openssl req \
-subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=Server CA/emailAddress=test@mochasoft.com.cn" \
-new \
-x509 \
-days 3650 \
-key ca.key \
-out ca.crt
# 3.生成需要頒發(fā)證書的私鑰
$ openssl genrsa -out server.key 2048
# 4.生成要頒發(fā)證書的證書簽名請求良蛮,證書簽名請求當(dāng)中的 Common Name 必須區(qū)別于 CA 的證書里面的 Common Name
$ openssl req \
-subj "/C=CN/ST=Tianjin/L=Tianjin/O=Mocha/OU=Mocha Software/CN=test2.sslpoc.com/emailAddress=test@mochasoft.com.cn" \
-new \
-key server.key \
-out server.csr
# 5.用 2 創(chuàng)建的 CA 證書給 4 生成的 簽名請求 進(jìn)行簽名
$ openssl x509 \
-req \
-days 3650 \
-in server.csr \
-CA ca.crt \
-CAkey ca.key \
-set_serial 01 \
-out server.crt
注:
- 指定證書數(shù)據(jù)內(nèi)容
-subj /C=CN/ST=Guangdong/L=Shenzhen/O=PAX/OU=Common Software/CN=Server CA/emailAddress=qiaojx@paxsz.com
- 去掉 key 加密的輸入提示:去掉
-des3
- 不提問:使用
-batch
參數(shù)
一、概述
本文非常簡單地展示了 SSL 的實(shí)現(xiàn)征峦,以及整個過程中,證書所扮演的角色。
1侦副、什么是證書及證書的作用
普通的 Web 傳輸污它,通過 Internet 發(fā)送未加密的數(shù)據(jù)剖踊。這樣的話,任何人使用恰當(dāng)?shù)墓ぞ叨伎梢愿Q視通訊數(shù)據(jù)的內(nèi)容衫贬。很明顯德澈,這會導(dǎo)致出現(xiàn)一些問題,尤其對于有安全和隱私比較敏感的場景祥山,如:信用卡數(shù)據(jù)圃验、銀行交易信息。SSL(Secure Socket Layer)用于加密在 Web Server 與 Web Client(最常見的是 Browser) 之間傳遞的數(shù)據(jù)流缝呕。
SSL 使用非對稱加密算法(Asymmetric Cryptography)澳窑,通常指 PKI(Public Key Cryptography)。使用 PKI 創(chuàng)建兩個秘鑰供常,一個公鑰摊聋,一個私鑰。使用任何一個 Key 做的加密栈暇,必須使用另外一個進(jìn)行解密麻裁。這樣的話,使用服務(wù)器私鑰加密的數(shù)據(jù)源祈,只能通過其對應(yīng)的公鑰進(jìn)行解密煎源,以確保數(shù)據(jù)是來自服務(wù)器。
為什么使用 SSL 處理數(shù)據(jù)需要證書香缺?其實(shí)從技術(shù)角度來說手销,證書并不是必需的,數(shù)據(jù)很安全图张,而且不容易被第三方解密锋拖。但是,證書對于通訊過程祸轮,扮演著至關(guān)重要的角色兽埃。證書通過可信的 CA 簽名,以確保證書的持有者與其對外所宣稱的身份一致适袜。使用未經(jīng)認(rèn)證簽名的證書柄错,數(shù)據(jù)可以被加密,但是與你通訊的一方,可能并不如你想鄙陡。沒有證書的話冕房,偽裝攻擊(Impersonation Attacks)會變得更為普遍。
2趁矾、證書的三個作用
- 加密通信
- 身份驗(yàn)證(驗(yàn)證對方確實(shí)是對方聲稱的對象)
- 數(shù)據(jù)完整性(無法被修改耙册,修改了會被知)
3、自簽名證書及自簽名類型
當(dāng)由于某種原因(如:不想通過 CA 購買證書毫捣,或者僅是用于測試等情況)详拙,無法正常獲取 CA 簽發(fā)的證書。這時可以生成一個自簽名證書蔓同。使用這個臨時證書的時候饶辙,會在客戶端瀏覽器報(bào)一個錯誤,簽名證書授權(quán)未知或不可信(signing certificate authority is unknown and not trusted.)斑粱。
- 自簽名證書
- 私有CA簽名的證書
自簽名證書的 Issuer
和 Subject
是一樣的
區(qū)別:
自簽名的證書無法被吊銷弃揽,CA 簽名的證書可以被吊銷。
能不能吊銷證書的區(qū)別在于:如果你的私鑰被黑客獲取则北,如果證書不能被吊銷矿微,則黑客可以偽裝成你與用戶進(jìn)行通信。
如果你的規(guī)劃需要創(chuàng)建多個證書尚揣,那么使用 私有 CA 的方法比較合適涌矢,因?yàn)橹灰o所有的客戶端都安裝了 CA 的證書,那么以該證書簽名過的證書快骗,客戶端都是信任的娜庇,也就是安裝一次就夠了。
如果你直接用自簽名證書方篮,你需要給所有的客戶端安裝該證書才會被信任名秀,如果你需要第二個證書,則還的挨個給所有的客戶端安裝證書2
才會被信任藕溅。
二匕得、自簽名證書
第一步:生成私鑰
openssl
工具集用于生成 RSA Private Key 和 CSR (Certificate Signing Request),也能用于生成自簽名證書蜈垮,用于測試目的或內(nèi)部使用。
第一步創(chuàng)建 RSA Private Key裕照。這個秘鑰:
- 1024 bit RSA key
- 使用 3DES 加密
- 使用 PEM 格式存儲攒发,ASCII,可讀
命令行:
$ openssl genrsa -des3 -out server.key 1024
執(zhí)行結(jié)果:
Generating RSA private key, 1024 bit long modulus
.........................................................++++++
........++++++
e is 65537 (0x10001)
Enter PEM pass phrase:
Verifying password - Enter PEM pass phrase:
第二步:從秘鑰中刪除 Passphrase
我們之前生成的私鑰晋南,是帶有 passphrase 的惠猿。這帶來一個副作用,就是需要在使用過程中輸入密碼负间。這對于一些特定場景來說會帶來一些問題偶妖。比如:Apache 的自動啟動過程姜凄,或者一些工具,甚至有沒有提供輸入 passphrase 的機(jī)會趾访。其實(shí)是可以將 3DES 的加密從秘鑰中移除的态秧,這樣,使用的過程中就不再需要輸入 passphrase扼鞋。這也帶來另一個問題申鱼,如果其他人獲取到了未加密的私鑰,對應(yīng)的證書也需要被吊銷云头,以避免帶來危害捐友。
使用以下命令行來從秘鑰中移除 pass-phrase:
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
新創(chuàng)建的 server.key
文件中,不再包含 passphrase溃槐。
-rw-r--r-- 1 root root 745 Jun 29 12:19 server.csr
-rw-r--r-- 1 root root 891 Jun 29 13:22 server.key
-rw-r--r-- 1 root root 963 Jun 29 13:22 server.key.org
第三步:生成 CSR (Certificate Signing Request)
一旦私鑰生成匣砖,CSR (Certificate Signing Request) 就可以被生成了。CSR 可以用于以下兩種用途中的任何一種:
- 理想地昏滴,將 CSR 發(fā)送到 CA猴鲫,例如: Thawte、Verisign影涉,會做身份驗(yàn)證变隔,并頒發(fā)簽名證書
- 對 CSR 進(jìn)行自簽名
本文的下一部分演示就是演示 CSR 進(jìn)行自簽名的方式。
生成 CSR 的過程中蟹倾,會提示輸入一些信息匣缘,這些是證書的 X.509
屬性。其中一個提示是 Common Name (e.g., YOUR name)
鲜棠,這個非常重要肌厨,這一項(xiàng)會填入 FQDN:(Fully Qualified Domain Name)完全合格域名/全稱域名,這個 FQDN 會被 SSL 保護(hù)豁陆。如果要被保護(hù)的網(wǎng)站是 https://public.akadia.com柑爸,那么輸入 public.akadia.com
。
用于生成 CSR 的命令行如下:
$ openssl req -new -key server.key -out server.csr
執(zhí)行過程界面如下:
Country Name (2 letter code) [GB]:CH
State or Province Name (full name) [Berkshire]:Bern
Locality Name (eg, city) [Newbury]:Oberdiessbach
Organization Name (eg, company) [My Company Ltd]:Akadia AG
Organizational Unit Name (eg, section) []:Information Technology
Common Name (eg, your name or your server's hostname) []:public.akadia.com
Email Address []:martin dot zahn at akadia dot ch
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
第四步:生成自簽名證書
當(dāng)由于某種原因(如:不想通過 CA 購買證書盒音,或者僅是用于測試等情況)表鳍,無法正常獲取 CA 簽發(fā)的證書。這時可以生成一個自簽名證書祥诽。使用這個臨時證書的時候譬圣,會在客戶端瀏覽器報(bào)一個錯誤,簽名證書授權(quán)未知或不可信(signing certificate authority is unknown and not trusted.)雄坪。
生成一個可以使用 365 天的臨時證書厘熟,使用如下命令行:
$ openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt
執(zhí)行結(jié)果:
Signature ok
subject=/C=CH/ST=Bern/L=Oberdiessbach/O=Akadia AG/OU=Information
Technology/CN=public.akadia.com/Email=martin dot zahn at akadia dot ch
Getting Private key
三、創(chuàng)建私有 CA ,然后用該 CA 給證書進(jìn)行簽名
第一步:創(chuàng)建 CA 私鑰
$ openssl genrsa -des3 -out ca.key 4096
第二步:生成 CA 的自簽名證書
$ openssl req -new -x509 -days 365 -key ca.key -out ca.crt
其實(shí) CA 證書就是一個自簽名證書
第三步:生成需要頒發(fā)證書的私鑰
$ openssl genrsa -des3 -out server.key 4096
第四步:生成要頒發(fā)證書的證書簽名請求
$ openssl req -new -key server.key -out server.csr
這里注意:證書簽名請求當(dāng)中的 Common Name
必須區(qū)別于 CA 的證書里面的 Common Name
第五步:用第二步
創(chuàng)建的 CA 證書給第四步
生成的簽名請求
進(jìn)行簽名
$ openssl x509 -req -days 365 -in server.csr -CA ca.crt -CAkey ca.key -set_serial 01 -out server.crt
四绳姨、生成證書鏈多級證書
1登澜、生成根 CA 并自簽(Common Name 填 RootCA)
$ openssl genrsa -des3 -out keys/RootCA.key 2048
$ openssl req -new -x509 -days 3650 -key keys/RootCA.key -out keys/RootCA.crt
2、生成二級 CA(Common Name 填 SecondCA)
$ openssl genrsa -des3 -out keys/secondCA.key 2048
$ openssl rsa -in keys/secondCA.key -out keys/secondCA.key
$ openssl req -new -days 3650 -key keys/secondCA.key -out keys/secondCA.csr
$ openssl ca -extensions v3_ca -in keys/secondCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/secondCA.crt -cert keys/RootCA.crt -keyfile keys/RootCA.key
3飘庄、生成三級 CA(Common Name 填 ThirdCA)
$ openssl genrsa -des3 -out keys/thirdCA.key 2048
$ openssl rsa -in keys/thirdCA.key -out keys/thirdCA.key
$ openssl req -new -days 3650 -key keys/thirdCA.key -out keys/thirdCA.csr
$ openssl ca -extensions v3_ca -in keys/thirdCA.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/thirdCA.crt -cert keys/secondCA.crt -keyfile keys/secondCA.key
4脑蠕、使用三級 CA 簽發(fā)服務(wù)器證書
$ openssl genrsa -des3 -out keys/server.key 2048
$ openssl rsa -in keys/server.key -out keys/server.key
$ openssl req -new -days 3650 -key keys/server.key -out keys/server.csr
$ openssl ca -in keys/server.csr -config /etc/pki/tls/openssl.cnf -days 3650 -out keys/server.crt -cert keys/thirdCA.crt -keyfile keys/thirdCA.key
注:
- 指定證書數(shù)據(jù)內(nèi)容
-subj /C=CN/ST=Guangdong/L=Shenzhen/O=PAX/OU=Common Software/CN=Server CA/emailAddress=qiaojx@paxsz.com
- 去掉 key 加密的輸入提示:去掉
-des3
- 不提問:使用
-batch
參數(shù)
五、吊銷證書(作廢證書)
首先
$ echo 00 > /etc/pki/CA/crlnumber
一般由于用戶私鑰泄露等情況才需要吊銷一個未過期的證書竭宰。(當(dāng)然我們用本測試 CA 時其時很少用到該命令空郊,除非專門用于測試吊銷證書的情況)
假設(shè)需要被吊銷的證書文件為 cert.pem
,則執(zhí)行以下命令吊銷證書:
$ openssl ca -revoke cert.pem -config /etc/pki/tls/openssl.cnf
生成證書吊銷列表文件(CRL)
準(zhǔn)備公開被吊銷的證書列表時切揭,可以生成證書吊銷列表(CRL)狞甚,執(zhí)行命令如下:
$ openssl ca -gencrl -out testca.crl -config /etc/pki/tls/openssl.cnf
還可以添加 -crldays
和 -crlhours
參數(shù)來說明下一個吊銷列表將在多少天后(或多少小時候)發(fā)布。
可以用以下命令檢查 testca.crl
的內(nèi)容:
$ openssl crl -in testca.crl -text -noout