IIS8中使用OpenSSL來建立CA並且簽發SSL證書
準備
- Windows 8 + IIS 8
- 直接下載編譯好的OpenSSL,由於我的系統是64位的,所以我下的是最新版的
Win64 OpenSSL v1.0.1e Light
- 安裝OpenSSL之前要先裝
Visual C++ 2008 SP1 Redistributables
,根據系統選擇32位的和64位下載並安裝
開始
第一步:安裝OpenSSL
- 儘管我們已經安裝了
Visual C++ 2008 SP1 Redistributables
,安裝剛開始還是會提示未安裝Visual C++ 2008 Redistributables
,不管它直接點選確定 - 一路下一步就可以了,安裝資料夾我選擇
C:\OpenSSL
- 在
Copy OpenSSL DLLs to:
The OpenSSL binaries (/bin) directory
,我不喜歡把什麼DLL都往Windows目錄丟,這樣放在應用程式目錄下比較乾淨 - 完成安裝
第二步:配置OpenSSL
1、將路徑C:\OpenSSL\bin\
新增到系統路徑中(控制面板 > 系統與安全 > 系統 > 高階系統設定 > 環境變數 > 系統變數 > Path),這樣在任何路徑中都能執行OpenSSL命令
2、開啟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 # 預設組織
3、接著準備資料夾及檔案:
- 新建資料夾
C:\OpenSSL\bin\KashuoCA
- 新建資料夾
C:\OpenSSL\bin\KashuoCA\newcerts
- 新建檔案
C:\OpenSSL\bin\KashuoCA\serial
(無後綴名),裡面寫入01
,用來存放簽發證書流水號 - 新建空檔案
C:\OpenSSL\bin\KashuoCA\index.txt
,用來存放簽發證書記錄
4、為了省去每次執行命令都要指定openssl.cfg的麻煩,開啟命令提示符(cmd.exe),將cfg檔案設為系統變數:
set OPENSSL_CONF=C:\OpenSSL\bin\openssl.cfg
5、重新開啟命令提示符,進入KashuoCA資料夾:
cd C:\OpenSSL\bin\KashuoCA
準備好以後開始下面的步驟
第三步:建立CA
命令:
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 []:[email protected]
這時候我們就有了CA根證書和私鑰了!
第四步:通過IIS生成證書申請檔案
由於本例中證書檔案是部署在IIS中,所以通過IIS直接生成證書檔案會比較方便。當然第二步中提到了通過OpenSSL的req方法也可以生成證書申請檔案。
1、開啟IIS
2、在左側連線
中選擇伺服器
3、在中間主頁
裡的IIS
中選擇伺服器證書
4、在右側操作
中選擇建立證書申請
5、在開啟的視窗中填入以下資訊:
通用名稱:www.kashuo.com 組織:Kashuo 組織單位:KashuoServer 城市/地點:Nanchang 省/市/自治區:Jiangxi 國家/地區:CN
通用名稱裡填寫的域名要與該證書所繫結的網站域名一致,否則使用者在瀏覽網站的時候會提示證書與域名不一致
6、加密服務選擇RSA和1024位
7、最後儲存證書申請的檔案為
C:\OpenSSL\bin\KashuoCA\certreq.txt
第五步:簽發伺服器證書
現在,CA證書檔案ca.cer、CA私鑰ca.key、伺服器證書申請certreq.txt三個檔案都在KashuoCA資料夾下
命令:
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根證書匯入到伺服器中。
- 雙擊
ca.cer
開啟證書詳情 - 點選
安裝證書
開啟證書匯入嚮導
- 儲存位置選擇
本地計算機
然後下一步 - 選擇
將所有的證書都放入下列儲存
- 點選瀏覽,選擇
受信任的根證據頒發機構
- 匯入完成
第七步:完成IIS證書申請
現在可以將第五步生成的iis.cer
匯入到IIS中了:
- 點選第四步
建立證書申請
下方的完成證書申請
- 選擇證書檔案:
C:\OpenSSL\bin\KashuoCA\iis.cer
- 輸入一個好記名稱,如
www.kashuo.com
- 證書儲存預設
個人
- 點選確定完成證書匯入
這個時候在伺服器證書列表裡就可以看到這個證書了。
第八步:開啟網站的SSL設定
安裝好IIS證書以後就可以開啟網站的SSL設定了:
- 在IIS左側
連線
中選擇網站
- 在右側
操作
中點選繫結
- 在開啟的
網站繫結
中新增一條記錄:型別
選擇https
主機名
填寫繫結的域名,如www.kashuo.com
證書
就選擇我們剛剛新增的證書- 確定完成
- 然後在中間
主頁
裡的IIS
中選擇SSL設定
,這裡根據自己的需求進行設定要求SSL
:勾選以後只能通過https訪問,否則http和https都可以訪問客戶證書
:- 忽略:不論客戶端有沒有證書都不檢驗
- 接受:如果客戶端沒有證書就不檢驗,否則彈出提示框讓使用者選擇證書並檢驗證書合法性
- 必需:客戶端必需提供合法證書才能進行訪問
- 設定完成以後點選右邊
應用
就可以了
對於單向認證SSL連線,在客戶證書
裡選擇忽略
就可以,教程到這裡也就結束了。客戶端在訪問https地址的時候會收到一個提示,即伺服器證書並非由信任的第三方證書頒發機構頒發,客戶端選擇繼續或者儲存為信任的證書就可以繼續訪問了。
如果對於安全性要求很高的網站,需要使用雙向認證SSL連線,在客戶證書
裡就要選擇必需
,即服務端和客戶端互相驗證對方證書的合法性。那就還需要為客戶端生成一個服務端認可的證書。
第九步:生成客戶端證書申請檔案
命令:
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 []:[email protected] Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
第十步:簽發客戶端證書
命令:
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 = [email protected] 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就是客戶端證書了
第十一步:將客戶端證書轉換為PKCS#12格式
命令:
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根證書。
接著安裝客戶端證書,這個就比較簡單了:
- 雙擊client.p12開啟證書詳情
- 儲存位置預設
當前使用者
- 輸入p12檔案的匯出密碼
- 根據個人需要勾選是否可匯出金鑰
自動選擇證書儲存
就可以- 大功告成!
當匯入客戶端完成以後,客戶端與服務端的雙向認證SSL就搞定了!