之前想過全站https,但那個時候證書難搞,因此一直沒動力去弄,這兩年IOS和小程序相繼強制使用https的接口,也預示着https的時代來臨,因此花了2天作了寫遷移工做,因爲服務器用的都是阿里雲全家桶,證書服務也不例外,話說阿里也很厚道,有免費的證書提供,還手把手交你弄,固然中間也會遇到坑,記錄之,下文絕大部分來自阿里雲的相關說明文檔,我主要是把nginx和apache的證書實踐了,其餘供參考。
PS:企業證書感受還挺貴,非企業證書按二級域名註冊算錢( ̄▽ ̄)~*javascript
公鑰(Public Key)與私鑰(Private Key)是經過一種算法獲得的一個密鑰對(即一個公鑰和一個私鑰),公鑰是密鑰對中公開的部分,私鑰則是非公開的部分。公鑰一般用於加密會話密鑰、驗證數字簽名,或加密能夠用相應的私鑰解密的數據。經過這種算法獲得的密鑰對能保證在世界範圍內是惟一的。使用這個密鑰對的時候,若是用其中一個密鑰加密一段數據,必須用另外一個密鑰解密。好比用公鑰加密數據就必須用私鑰解密,若是用私鑰加密也必須用公鑰解密,不然解密將不會成功。
數字證書是一個經證書受權中心(CA)數字簽名的包含公開密鑰擁有者信息以及公開密鑰的文件。最簡單的證書包含一個公開密鑰、名稱以及證書受權中心的數字簽名。數字證書還有一個重要的特徵就是隻在特定的時間段內有效。
阿里雲證書服務對您密鑰的加密算法和長度有以下要求:加密算法使用RSA,加密長度至少2048,推薦您使用2048位,SHA256摘要算法。
您能夠經過以下方式建立私鑰:html
OpenssL是一個強大且應用普遍的安全基礎庫工具,您能夠在 http://www.openssl.org/source/ 來獲取最新的openssl安裝包(版本要>=1.0.1g)。
在命令行模式下運行:
openssl genrsa -out myprivate.pem 2048
來生成您的私鑰文件: myprivate.pem, 其中"2048"是加密長度java
Keytool是JDK中自帶的密鑰管理工具,能夠製做Keystore(jks)格式的證書文件,您能夠在 http://www.oracle.com/technetwork/java/javase/downloads/index.html 中下載JDK來獲取keytool工具。
由於keystore製做公鑰和私鑰默認是不能夠導出的,因此須要您從已經建立好的 .keystore 文件中導出私鑰。
從 .keystore 中導出私鑰須要參考 主流數字證書都有哪些格式?中的轉換方法1和4。
在導出的文件中node
-----BEGIN RSA PRIVATE KEY----- …… -----END RSA PRIVATE KEY-----
或者相似於nginx
-----BEGIN PRIVATE KEY----- …… -----END PRIVATE KEY-----
的便是私鑰。
不管哪一種方式生成密鑰,都請您完善的保護好您的私鑰文件,私鑰文件若是丟失或者損壞,您申請對應的公鑰/數字證書將沒法使用。web
通常來講,主流的Web服務軟件,一般都基於兩種基礎密碼庫:OpenSSL和Java。
Tomcat、Weblogic、JBoss等,使用Java提供的密碼庫。經過Java的Keytool工具,生成Java Keystore(JKS)格式的證書文件。
Apache、Nginx等,使用OpenSSL提供的密碼庫,生成PEM、KEY、CRT等格式的證書文件。
此外,IBM的產品,如Websphere、IBM Http Server(IHS)等,使用IBM產品自帶的iKeyman工具,生成KDB格式的證書文件。微軟Windows Server中的Internet Information Services(IIS),使用Windows自帶的證書庫生成PFX格式的證書文件。
若是您在工做中遇到帶有後綴擴展名的證書文件,能夠簡單用以下方法區分:
*.DER *.CER
: 這樣的證書文件是二進制格式,只含有證書信息,不包含私鑰。
*.CRT
: 這樣的文件能夠是二進制格式,也能夠是文本格式,通常均爲文本格式,功能與.DER/.CER相同。
*.PEM
: 通常是文本格式,能夠放證書或私鑰,或者二者都包含。 .PEM若是隻包含私鑰,那通常用 .KEY代替。
*.PFX *.P12
是二進制格式,同時含證書和私鑰,通常有密碼保護。
怎麼判斷是文本格式仍是二進制?
用記事本打開,若是是規則的數字字母,如算法
—–BEGIN CERTIFICATE—– MIIE5zCCA8+gAwIBAgIQN+whYc2BgzAogau0dc3PtzANBgkqh…… —–END CERTIFICATE—–
就是文本的,上面的BEGIN CERTIFICATE,說明這是一個證書
若是是—–BEGIN RSA PRIVATE KEY—–,說明這是一個私鑰
這些證書格式之間是能夠互相轉換的
shell
如下提供了一些證書之間的轉換方法:
1. 將JKS轉換成PFX
可使用Keytool工具,將JKS格式轉換爲PFX格式。
keytool -importkeystore -srckeystore D:\server.jks -destkeystore D:\server.pfx -srcstoretype JKS -deststoretype PKCS12
apache
2. 將PFX轉換爲JKS
可使用Keytool工具,將PFX格式轉換爲JKS格式。
keytool -importkeystore -srckeystore D:\server.pfx -destkeystore D:\server.jks -srcstoretype PKCS12 -deststoretype JKS
小程序
3. 將PEM/KEY/CRT轉換爲PFX
使用OpenSSL工具,能夠將密鑰文件KEY和公鑰文件CRT轉化爲PFX文件。
將密鑰文件KEY和公鑰文件CRT放到OpenSSL目錄下,打開OpenSSL執行如下命令:
openssl pkcs12 -export -out server.pfx -inkey server.key -in server.crt
4. 將PFX轉換爲PEM/KEY/CRT
使用OpenSSL工具,能夠將PFX文件轉化爲密鑰文件KEY和公鑰文件CRT。
將PFX文件放到OpenSSL目錄下,打開OpenSSL執行如下命令:
openssl pkcs12 -in server.pfx -nodes -out server.pem
openssl rsa -in server.pem -out server.key
請注意 此步驟是專用於使用keytool生成私鑰和CSR申請證書,而且獲取到pem格式證書公鑰的狀況下作分離私鑰使用的,因此在實際部署證書時請使用此步驟分離出來的私鑰和申請下來的公鑰證書作匹配使用。
雲盾證書服務統一使用 PEM 格式的數字證書文件。
SSL證書沒有所謂的「品質」和「等級」之分,只有三種不一樣的類型。
SSL證書須要向國際公認的證書證書認證機構(簡稱CA,Certificate Authority)申請。
CA機構頒發的證書有3種類型:
這裏咱們選擇阿里雲免費域名(由於服務器等資源都在阿里雲,首次試水,後期所有遷移再考慮企業證書)
填寫完相關信息
開始會要求咱們選擇生成CSR(Cerificate Signing Request)
強烈建議採用阿里雲系統提供的建立CSR功能,避免出現內容不正確而致使的審覈失敗。關於審覈失敗,請查看審覈失敗 - 主域名不能爲空。
在申請數字證書以前,您必須先生成證書私鑰和證書請求文件(Cerificate Signing Request,簡稱CSR)。CSR是您的公鑰證書原始文件,包含了您的服務器信息和您的單位信息,須要提交給CA認證中心。
在生成CSR文件時會同時生成私鑰文件,請妥善保管和備份您的私鑰。
生成CSR文件時,通常須要輸入如下信息(中文須要UTF8編碼):
Organization Name(O):申請單位名稱法定名稱,能夠是中文或英文
Organization Unit(OU):申請單位的所在部門,能夠是中文或英文
Country Code(C):申請單位所屬國家,只能是兩個字母的國家碼,如中國只能是:CN
State or Province(S):申請單位所在省名或州名,能夠是中文或英文
Locality(L):申請單位所在城市名,能夠是中文或英文
Common Name(CN):申請SSL證書的具體網站域名
若是選擇手動,則本身生成上傳
一、執行命令openssl req -new -nodes -sha256 -newkey rsa:2048 -keyout myprivate.key -out mydomain.csr
生成CSR文件。
二、生成CSR文件mydomain.csr。
須要輸入的信息說明以下:
字段 | 說明 | 示例 |
---|---|---|
Country | Name | |
ISO國家代碼 | (兩位字符) | CN |
State or Province Name | 所在省份 | ZheJiang |
Locality Name | 所在城市 | HangZhou |
Organization Name | 公司名稱 | HangZhou xxx Technologies, Inc. |
Organizational Unit Name | 部門名稱 | IT Dept. |
Common Name | 申請證書的域名 | www.example.com |
Email Address | 不須要輸入 | - |
A challenge password | 不須要輸入 | - |
完成命令提示的輸入後,會在當前目錄下生成myprivate.key(私鑰文件)和mydomain.csr(CSR,證書請求文件)兩個文件。
注意:在使用OpenSSL工具生成中文證書時須要注意中文編碼格式必須使用utf8編碼。同時,須要在編譯OpenSSL工具時指定支持utf8格式。
若是對中文有需求,推薦您使用keytool工具生成CSR文件。
一、生成證書文件keystore。
證書文件中包含密鑰,導出密鑰方式請查看主流數字證書都有哪些格式?
執行命令keytool -genkey -alias mycert -keyalg RSA -keysize 2048 -keystore ./mydomain.jks
生成keystore證書文件。
輸入證書保護密碼,而後根據下表依次輸入所需信息:
問題 | 說明 | 示例 |
---|---|---|
What is your first and last name? | 申請證書的域名 | www.example.com |
What is the name of your organizational unit? | 部門名稱 | IT Dept. |
What is the name of your organization? | 公司名稱 | HangZhou xxx Technologies,Ltd. |
What is the name of your City or Locality? | 所在城市 | HangZhou |
What is the name of your State or Province? | 所在省份 | ZheJiang |
What is the two-letter country code for this unit? | ISO國家代碼(兩位字符) | CN |
輸入完成後,確認輸入內容是否正確,輸入 Y 表示正確。
根據提示輸入密鑰密碼。能夠與證書密碼一致,若是一致直接按回車鍵便可。
二、經過證書文件生成證書請求。
執行命令keytool -certreq -sigalg SHA256withRSA -alias mycert -keystore ./mydomain.jks -file ./mydomain.csr
生成CSR文件。
注意:咱們對CSR的密鑰長度有嚴格要求,密鑰長度必須是2048位,密鑰類型必須爲RSA。若是申請證書是多域名或者通配子域名,在「Common Name」或「What is your first and last name?」 字段只須要輸入一個域名便可(通配子域名能夠輸入「*.example.com」等)。
後面,各類下一步
此時須要作DNS域名解析,解析完成檢測到便可頒發證書。
可是坑爹的是,不能存在CNAME記錄?這怎麼可能臨時去掉,沒辦法,撤回從新手動
其中windows服務器其實也沒什麼大礙,前面的提示還說windows服務器沒法查看隱藏目錄,實際上是能夠的
配置完成以後等待一段時間,免費證書會自動簽發。
主要就是服務器的配置過程
文件說明:
一、證書文件214207978510820.pem,包含兩段內容,請不要刪除任何一段內容。
二、若是是證書系統建立的CSR,還包含:證書私鑰文件214207978510820.key。
( 1 ) 在Nginx的安裝目錄下建立cert目錄,而且將下載的所有文件拷貝到cert目錄中。若是申請證書時是本身建立的CSR文件,請將對應的私鑰文件放到cert目錄下而且命名爲214207978510820.key;
注:若是是yum安裝的nginx,就直接進入配置目錄便可
( 2 ) 打開 Nginx 安裝目錄下 conf 目錄中的 nginx.conf 文件,找到:
# HTTPS server # #server { # listen 443; # server_name localhost; # ssl on; # ssl_certificate cert.pem; # ssl_certificate_key cert.key; # ssl_session_timeout 5m; # ssl_protocols SSLv2 SSLv3 TLSv1; # ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP; # ssl_prefer_server_ciphers on; # location / { # # #} #}
( 3 ) 將其修改成 (如下屬性中ssl開頭的屬性與證書配置有直接關係,其它屬性請結合本身的實際狀況複製或調整) :
server { listen 443; server_name localhost; ssl on; root html; index index.html index.htm; ssl_certificate cert/214207978510820.pem; ssl_certificate_key cert/214207978510820.key; ssl_session_timeout 5m; ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_prefer_server_ciphers on; location / { root html; index index.html index.htm; } }
保存退出。
( 4 )重啓 Nginx。
( 5 ) 經過 https 方式訪問您的站點,測試站點證書的安裝配置。如遇到證書不信任問題,請查看幫助視頻。
補充:
如需強制跳轉http至https,有以下3種便捷方式
server { listen 192.168.1.111:80; server_name test.com; rewrite ^(.*)$ https://$host$1 permanent; }
或者在index.html中添加meta
<html> <meta http-equiv="refresh" content="0;url=https://test.com/"> </html>
或者頁面調用js
<script type="text/javascript"> var targetProtocol = "https:"; if (window.location.protocol != targetProtocol) window.location.href = targetProtocol + window.location.href.substring(window.location.protocol.length); </script>
文件說明:
#LoadModule ssl_module modules/mod_ssl.so (若是找不到請確認是否編譯過 openssl 插件) #Include conf/extra/httpd-ssl.conf
( 3 ) 打開 apache 安裝目錄下 conf/extra/httpd-ssl.conf 文件 (也多是conf.d/ssl.conf,與操做系統及安裝方式有關), 在配置文件中查找如下配置語句:
# 添加 SSL 協議支持協議,去掉不安全的協議 SSLProtocol all -SSLv2 -SSLv3 # 修改加密套件以下 SSLCipherSuite HIGH:!RC4:!MD5:!aNULL:!eNULL:!NULL:!DH:!EDH:!EXP:+MEDIUM SSLHonorCipherOrder on # 證書公鑰配置 SSLCertificateFile cert/public.pem # 證書私鑰配置 SSLCertificateKeyFile cert/214207978510820.key # 證書鏈配置,若是該屬性開頭有 '#'字符,請刪除掉 SSLCertificateChainFile cert/chain.pem
( 4 ) 重啓 Apache。
( 5 ) 經過 https 方式訪問您的站點,測試站點證書的安裝配置,如遇到證書不信任問題,請查看幫助視頻。
補充:
一、須要把這些模塊開啓mod_log_config, mod_setenvif, mod_ssl,socache_shmcb_module
二、若是簽名包含全部網站,那麼能夠提取SSLCertificateFile,SSLCertificateKeyFile,SSLCertificateChainFile配置到virtualhot外面,你們公用一個簽名,不然寫到裏面,每一個虛擬站點一個簽名。
三、當你的站點使用了HTTPS以後,你可能會想把全部的HTTP請求(即端口80的請求),所有都重定向至HTTPS(即端口443)。這時候你能夠用如下的方式來作到:(注意開啓Apache mod_rewrite)
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://jb51.net/$1 [R=301,L] </IfModule>
把這段代碼放在.htaccess文件,便可實現HTTP到HTTPS的重定向。
而當你又想用回HTTP的時候,反過來就能夠了:
<IfModule mod_rewrite.c> RewriteEngine On RewriteBase / RewriteCond %{SERVER_PORT} 443 RewriteRule ^(.*)$ http://jb51.net/$1 [R=301,L] </IfModule>
其中R=301表示Moved Permanently,即告訴搜索引擎或者瀏覽器下去直接訪問後者的地址,若是隻是試驗性地重定向,可使用R=302(Found)。
VirtualHost示例
<VirtualHost *:80> ServerAdmin webmaster@domain.cn ServerName www.domain.com DocumentRoot "d:/wwwroot/newweb/" RewriteEngine On RewriteCond %{SERVER_PORT} 80 RewriteRule ^(.*)$ https://www.domain.com/$1 [R=301,L] </VirtualHost>
Tomcat支持JKS格式證書,從Tomcat7開始也支持PFX格式證書,兩種證書格式任選其一。
文件說明:
一、證書格式轉換
在Tomcat的安裝目錄下建立cert目錄,而且將下載的所有文件拷貝到cert目錄中。若是申請證書時是本身建立的CSR文件,附件中只包含214207978510820.pem文件,還須要將私鑰文件拷貝到cert目錄,命名爲214207978510820.key;若是是系統建立的CSR,請直接到第2步。
到cert目錄下執行以下命令完成PFX格式轉換命令,此處要設置PFX證書密碼,請牢記:
openssl pkcs12 -export -out 214207978510820.pfx -inkey 214207978510820.key -in 214207978510820.pem
二、PFX證書安裝
找到安裝Tomcat目錄下該文件server.xml,通常默認路徑都是在 conf 文件夾中。找到 <Connection port="8443" 標籤,增長以下屬性:
keystoreFile="cert/214207978510820.pfx" keystoreType="PKCS12" #此處的證書密碼,請參考附件中的密碼文件或在第1步中設置的密碼 keystorePass="證書密碼"
完整的配置以下,其中port屬性根據實際狀況修改:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" keystoreFile="cert/214207978510820.pfx" keystoreType="PKCS12" keystorePass="證書密碼" clientAuth="false" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
三、JKS證書安裝(幫助)
( 1 ) 使用java jdk將PFX格式證書轉換爲JKS格式證書(windows環境注意在%JAVA_HOME%/jdk/bin目錄下執行)
keytool -importkeystore -srckeystore 214207978510820.pfx -destkeystore your-name.jks -srcstoretype PKCS12 -deststoretype JKS
回車後輸入JKS證書密碼和PFX證書密碼,強烈推薦將JKS密碼與PFX證書密碼相同,不然可能會致使Tomcat啓動失敗。
( 2 ) 找到安裝 Tomcat 目錄下該文件Server.xml,通常默認路徑都是在 conf 文件夾中。找到 <Connection port="8443" 標籤,增長以下屬性:
keystoreFile="cert/your-name.jks" keystorePass="證書密碼"
完整的配置以下,其中port屬性根據實際狀況修改:
<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https" secure="true" keystoreFile="cert/your-name.jks" keystorePass="證書密碼" clientAuth="false" SSLProtocol="TLSv1+TLSv1.1+TLSv1.2" ciphers="TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA,TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_128_CBC_SHA256,TLS_RSA_WITH_AES_256_CBC_SHA256"/>
( 注意:不要直接拷貝全部配置,只需添加 keystoreFile,keystorePass等參數便可,其它參數請根據本身的實際狀況修改 )
四、 重啓 Tomcat。
五、 經過 https 方式訪問您的站點,測試站點證書的安裝配置,如遇到證書不信任問題,請查看幫助視頻。
IIS 7/8 支持PFX格式證書,下載包中包含PFX格式證書和密碼文件。以沃通證書爲例:
文件說明:
( 1 ) 證書導入
( 2 ) 分配服務器證書
一、API級別遷移,https不會有什麼問題,先後兼容便可,等所有遷移完,再取消或者重定向http到https,而網站全站遷移要注意,若是https中還有加載http的js請求,那麼瀏覽器會報錯屏蔽,須要全部的子資源接口也遷移至https才行,而且建議全部資源所有遷移https,這是一個麻煩的工程
二、https使用的是443端口,注意防火牆放行,不然瀏覽器可能會有連接被重置、關閉等錯誤。
三、SSL協議優先選用更加安全的TLS
四、若一切正常,瀏覽器會顯示一個小綠鎖
一、免費的證書供應商:
https://letsencrypt.org/ 90天過時,可使用crontab定時申請
二、開啓http2,性能飛昇
配置 http2,這要求 Nginx 版本要大於 1.9.5。HTTP2 具備更快的 HTTPS 傳輸性能,很是值得開啓(關於性能你能夠看一下這篇文章)。須要開啓HTTP/2其實很簡單,只須要在 nginx.conf 的 listen 443 ssl; 後面加上 http2 就行了。以下所示:
listen 443 ssl http2; # managed by Certbot ssl_certificate /etc/letsencrypt/live/coolshell.cn/fullchain.pem; # managed by Certbot ssl_certificate_key /etc/letsencrypt/live/coolshell.cn/privkey.pem; # managed by Certbot include /etc/letsencrypt/options-ssl-nginx.conf; # managed by Certbot
而後,就 nginx -s reload 就行了。