【轉載】http://alvinhu.com/blog/2013/06/12/creating-a-certificate-authority-and-signing-the-ssl-certificates-using-openssl-in-iis8/html
最近在爲新的iOS app考慮安全機制,第一個進入腦海裏的就是HTTPS和SSL。因此研究了一下Windows服務器下IIS部署HTTPS和證書的方法,以及如何讓app與server進行安全的信息交互。ios
因爲網上千篇一概的只是教你們怎麼怎麼操做,並無告訴你們爲何這麼操做。而做爲一個喜歡打破砂鍋問到底的強迫症患者,本身又花了一些時間研究了各個步驟及參數的原理,在這裏把這些小小的理解及經驗記錄下來,即給有一樣需求的同行們作個參考,也給將來的本身留做備份。web
歡迎轉載,轉載請保留原文地址。算法
本人並不是互聯網安全專家,也不是OpenSSL老手。若是這篇文章對你有用,本人很是高興。若是沒法解決問題,你能夠google其餘更專業的文章,我相信只要花點時間確定可以找到答案。本文中全部步驟都通過本人屢次測試,但不能保證必定正確,在此僅供參考。若有不對之處,歡迎留言探討及指正。瀏覽器
Win64 OpenSSL v1.0.1e Light
Visual C++ 2008 SP1 Redistributables
,根據系統選擇32位的和64位下載並安裝Visual C++ 2008 SP1 Redistributables
,安裝剛開始仍是會提示未安裝Visual C++ 2008 Redistributables
,無論它直接點擊肯定C:\OpenSSL
Copy OpenSSL DLLs to:
的地方我選擇The OpenSSL binaries (/bin) directory
,我不喜歡把什麼DLL都往Windows目錄丟,這樣放在應用程序目錄下比較乾淨一、將路徑C:\OpenSSL\bin\
添加到系統路徑中(控制面板 > 系統與安全 > 系統 > 高級系統設置 > 環境變量 > 系統變量 > Path),這樣在任何路徑中都能運行OpenSSL命令安全
二、打開openssl.cfg,修改一下配置:服務器
dir = . # 存放CA文件的文件夾,裏面還須要手動創建子文件夾及件,後面會提到 default_days = 10950 # 證書有效期,設30年比較省心 policy = policy_anything # CA資料和證書申請資料的匹配策略改成這個比較方便 countryName_default = CN # 默認國家 stateOrProvinceName_default = Jiagxi # 默認省份 localityName_default = Nanchang # 默認城市,在localityName = Locality Name (eg,city)下增長這一條 0.organizationName_default = Kashuo # 默認組織
三、接着準備文件夾及文件:網絡
C:\OpenSSL\bin\KashuoCA
C:\OpenSSL\bin\KashuoCA\newcerts
C:\OpenSSL\bin\KashuoCA\serial
(無後綴名),裏面寫入01
,用來存放簽發證書流水號C:\OpenSSL\bin\KashuoCA\index.txt
,用來存放簽發證書記錄四、爲了省去每次運行命令都要指定openssl.cfg的麻煩,打開命令提示符(cmd.exe),將cfg文件設爲系統變量:app
1
|
set OPENSSL_CONF=C:\OpenSSL\bin\openssl.cfg |
五、從新打開命令提示符,進入KashuoCA文件夾:dom
1
|
cd C:\OpenSSL\bin\KashuoCA |
準備好之後開始下面的步驟
命令:
1
|
openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.cer |
參數:
req # 用來生成PKCS#10格式的證書申請文件,也能夠生成自簽名的CA根證書 -x509 # 有這個參數就是生成CA根證書,沒有就是生成證書申請文件 -newkey rsa:1024 # 同時生成1024位RSA算法的私鑰 -keyout # CA私鑰 -out # 證書申請文件或CA根證書
因爲咱們以前已經設置了證書有效期和cfg文件的地址,因此在命令裏就不須要重複設置了
運行命令之後會要求輸入私鑰密碼,而且再輸入一次確認密碼。在輸入國家省份等資料的時候直接回車使用以前咱們設置的默認值就能夠了,可是在Organizational Unit Name
、Common Name
和Email Address
三個地方沒有設置默認值,由於這三個資料在CA證書和服務器證書裏是不同的。
C:\OpenSSL\bin\KashuoCA>openssl req -x509 -newkey rsa:1024 -keyout ca.key -out ca.cer Loading 'screen' into random state - done Generating a 1024 bit RSA private key ...........++++++ .........................++++++ writing new private key to 'ca.key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [Jiangxi]: Locality Name (eg, city) [Nanchang]: Organization Name (eg, company) [Kashuo]: Organizational Unit Name (eg, section) []:KashuoCA Common Name (e.g. server FQDN or YOUR name) []:KashuoCA Email Address []:ca@kashuo.com
這時候咱們就有了CA根證書和私鑰了!
因爲本例中證書文件是部署在IIS中,因此經過IIS直接生成證書文件會比較方便。固然第二步中提到了經過OpenSSL的req方法也能夠生成證書申請文件。
一、打開IIS
二、在左側鏈接
中選擇服務器
三、在中間主頁
裏的IIS
中選擇服務器證書
四、在右側操做
中選擇建立證書申請
五、在打開的窗口中填入如下信息:
通用名稱:www.kashuo.com 組織:Kashuo 組織單位:KashuoServer 城市/地點:Nanchang 省/市/自治區:Jiangxi 國家/地區:CN
通用名稱裏填寫的域名要與該證書所綁定的網站域名一致,不然用戶在瀏覽網站的時候會提示證書與域名不一致
六、加密服務選擇RSA和1024位
七、最後保存證書申請的文件爲C:\OpenSSL\bin\KashuoCA\certreq.txt
如今,CA證書文件ca.cer、CA私鑰ca.key、服務器證書申請certreq.txt三個文件都在KashuoCA文件夾下
命令:
1
|
openssl ca -in certreq.txt -cert ca.cer -keyfile ca.key -out iis.cer |
參數:
ca # 主要用來簽發證書申請 -in # 證書申請文件 -cert # CA證書 -keyfile # CA私鑰 -out # 簽發的證書
運行命令之後須要輸入CA的私鑰密碼
C:\OpenSSL\bin\KashuoCA>openssl ca -in certreq.txt -cert ca.cer -keyfile ca.key -out iis.cer Using configuration from C:\OpenSSL\bin\openssl.cfg Loading 'screen' into random state - done Enter pass phrase for ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 1 (0x1) Validity Not Before: Jun 13 10:32:25 2013 GMT Not After : Jun 6 10:32:25 2043 GMT Subject: countryName = CN stateOrProvinceName = Jiangxi localityName = Nanchang organizationName = Kashuo organizationalUnitName = KashuoServer commonName = www.kashuo.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: E0:8A:69:4A:D1:0A:98:26:EA:AE:AF:5E:6D:A7:A7:C4:DE:07:13:DF X509v3 Authority Key Identifier: keyid:37:48:69:62:0E:FD:FB:1E:83:EB:DE:2D:0D:F6:55:C1:E1:76:EF:BA Certificate is to be certified until Jun 6 10:32:25 2043 GMT (10950 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
最後咱們獲得了服務器證書iis.cer
因爲第三步生成的CA根證書是自簽名的,並不是由系統能夠識別的第三方信任機構簽發,因此須要將CA根證書導入到服務器中。
ca.cer
打開證書詳情安裝證書
打開證書導入嚮導
本地計算機
而後下一步將全部的證書都放入下列存儲
受信任的根證據頒發機構
如今能夠將第五步生成的iis.cer
導入到IIS中了:
建立證書申請
下方的完成證書申請
C:\OpenSSL\bin\KashuoCA\iis.cer
www.kashuo.com
我的
這個時候在服務器證書列表裏就能夠看到這個證書了。
安裝好IIS證書之後就能夠打開網站的SSL設置了:
鏈接
中選擇網站
操做
中點擊綁定
網站綁定
中添加一條記錄:
類型
選擇https
主機名
填寫綁定的域名,如www.kashuo.com
證書
就選擇咱們剛剛添加的證書主頁
裏的IIS
中選擇SSL設置
,這裏根據本身的需求進行設置
要求SSL
:勾選之後只能經過https訪問,不然http和https均可以訪問客戶證書
:
應用
就能夠了對於單向認證SSL鏈接,在客戶證書
裏選擇忽略
就能夠,教程到這裏也就結束了。客戶端在訪問https地址的時候會收到一個提示,即服務器證書並不是由信任的第三方證書頒發機構頒發,客戶端選擇繼續或者保存爲信任的證書就能夠繼續訪問了。
若是對於安全性要求很高的網站,須要使用雙向認證SSL鏈接,在客戶證書
裏就要選擇必需
,即服務端和客戶端互相驗證對方證書的合法性。那就還須要爲客戶端生成一個服務端承認的證書。
命令:
1
|
openssl req -newkey rsa:1024 -keyout client.key -out client.csr |
參數:
req # 用來生成PKCS#10格式的證書申請文件,也能夠生成自簽名的CA根證書 -newkey rsa:1024 # 同時生成1024位RSA算法的私鑰 -keyout # 證書私鑰 -out # 證書申請文件
細心的你可能發現這個命令和第三步創建CA的命令差很少,區別是少了-x509
參數和輸出的是證書申請文件。 運行命令之後輸入兩次客戶端私鑰密碼,而後就是客戶端的一些基本信息。最後的A challenge password
和An optional company name
不是必填的,我就直接回車跳過了。
C:\OpenSSL\bin\KashuoCA>openssl req -newkey rsa:1024 -keyout client.key -out client.csr Loading 'screen' into random state - done Generating a 1024 bit RSA private key ........++++++ ...++++++ writing new private key to 'client.key' Enter PEM pass phrase: Verifying - Enter PEM pass phrase: ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [CN]: State or Province Name (full name) [Jiangxi]: Locality Name (eg, city) [Nanchang]: Organization Name (eg, company) [Kashuo]: Organizational Unit Name (eg, section) []:KashuoApp Common Name (e.g. server FQDN or YOUR name) []:Client Email Address []:client@kashuo.com Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
命令:
1
|
openssl ca -in client.csr -cert ca.cer -keyfile ca.key -out client.cer |
參數:
ca # 主要用來簽發證書申請 -in # 證書申請文件 -cert # CA證書 -keyfile # CA私鑰 -out # 簽發的證書
簽發客戶端證書和簽發服務器證書的命令是同樣的。運行命令之後一樣須要輸入CA的私鑰密碼
C:\OpenSSL\bin\KashuoCA>openssl ca -in client.csr -cert ca.cer -keyfile ca.key -out client.cer Using configuration from C:\OpenSSL\bin\openssl.cfg Loading 'screen' into random state - done Enter pass phrase for ca.key: Check that the request matches the signature Signature ok Certificate Details: Serial Number: 2 (0x2) Validity Not Before: Jun 20 14:03:18 2013 GMT Not After : Jun 13 14:03:18 2043 GMT Subject: countryName = CN stateOrProvinceName = Jiangxi localityName = Nanchang organizationName = Kashuo organizationalUnitName = KashuoApp commonName = Client emailAddress = client@kashuo.com X509v3 extensions: X509v3 Basic Constraints: CA:FALSE Netscape Comment: OpenSSL Generated Certificate X509v3 Subject Key Identifier: 44:C7:B1:DA:5E:36:34:8C:6F:37:17:82:BB:F2:CD:AC:69:1A:3F:41 X509v3 Authority Key Identifier: keyid:FE:79:C3:FF:9E:4F:AA:AA:8F:BD:03:19:1A:02:CD:60:27:FB:98:67 Certificate is to be certified until Jun 13 14:03:18 2043 GMT (10950 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
client.cer就是客戶端證書了
命令:
1
|
openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12 |
參數:
pkcs12 # 生成或解析PKCS#12證書 -export # 生成證書 -clcerts # 輸出客戶端證書 -in # 原證書 -inkey # 私鑰 -out # 轉換後證書
先輸入客戶端證書私鑰密碼,而後輸入兩次p12文件的導出密碼
C:\OpenSSL\bin\KashuoCA>openssl pkcs12 -export -clcerts -in client.cer -inkey client.key -out client.p12 Loading 'screen' into random state - done Enter pass phrase for client.key: Enter Export Password: Verifying - Enter Export Password:
client.p12包含客戶端證書和私鑰,支持瀏覽器直接導入,最後一步就是導入p12證書了。
在客戶端電腦導入客戶端證書以前須要先導入CA根證書,將第三步生成的CA根證書文件拷貝到客戶端電腦裏,按照第六步的流程導入CA根證書。
接着安裝客戶端證書,這個就比較簡單了:
當前用戶
自動選擇證書存儲
就能夠當導入客戶端完成之後,客戶端與服務器的雙向認證SSL就搞定了!
更多轉換方式見:http://blog.csdn.net/linda1000/article/details/8676330
PEM編碼證書轉換爲DER編碼證書
命令:
1
|
openssl x509 -outform der -in iis.cer -out iisder.cer |
參數:
x509 # x509證書管理 -outform der # 轉換爲DER編碼 -in # 原證書 -out # 轉換後證書
目前我在iOS開發中使用了AFNetworking,在作SSL Pinning
的時候讀取服務器證書要求證書編碼爲DER,而第五步生成的證書編碼爲PEM,因此須要用這個命令轉換一下。
關於SSL Pinning能夠查看我另外一片文章:經過SSL Pinning提升iOS應用的安全性
經過此次的CA安裝和簽發證書的學習,弄清了經過SSL提升網絡請求安全性的基本原理,也明白了證書究竟是個什麼東西。其實只要有心,沒有什麼是深不可測的。
固然自簽名CA根證書只是一個臨時解決方案,也是學習概念和理論的好途徑,若是在大型應用而且不差錢話仍是去可信任的CA機構購買證書吧!全文完!