在win7下試試:
1.實現一個最簡單的HTTPS Web Server
// gohttps/2-https/server.go package main import ( "fmt" "net/http" ) func handler(w http.ResponseWriter, r *http.Request) { fmt.Fprintf(w, "Hi, This is an example of https service in golang!") } func main() { http.HandleFunc("/", handler) http.ListenAndServeTLS(":8081", "server.crt", "server.key", nil) }
上述代碼無法正常運行,因為沒有server.crt和server.key
2、安裝openssl
2.1可到http://slproweb.com/products/Win32OpenSSL.html下載Win64 OpenSSL v1.1.0j。好像該地址應該可以下載Visual C++ 2008Redistributables (x64)的 但是我沒找到。直接安裝下載的 Win64 OpenSSL v1.1.0j
注:我是直接下載安裝了,略過了下面的2.2和2.3
2.2下載Openssl源碼,去官網http://www.openssl.org/下載openssl-1.1.0j.tar.gz即可。
解壓openssl-1.0.1j.tar.gz,找到\openssl-1.0.1j\apps目錄,拷貝demoCA目錄和openssl.cnf文件到Openssl的安裝目錄下的bin目錄下(即D:\OpenSSL-Win64\bin\)。
2.3、在D:\OpenSSL-Win64\bin目錄下,創建ca、jks、server、client四個目錄。
3、生成 server.key和server.crt
3.1 生成 server.key
openssl genrsa -out server.key 2048
注:因為懶得加環境變量,我是在D:\OpenSSL-Win64\bin目錄下執行的openssl
3.2生成 server.crt
openssl req -new -x509 -key server.key -out server.crt -days 3650
按照給出的提示依次輸入:CN BJ 等,如下:
-----
Country Name (2 letter code) [AU]:CN
State or Province Name (full name) [Some-State]:BJ
Locality Name (eg, city) []:BJ
Organization Name (eg, company) [Internet Widgits PtyLtd]:ple
Organizational Unit Name (eg, section) []:live
Common Name (eg, YOUR name) []:root
Email Address []:
---------------------
4.將生成的server.crt和server.key剪切復制到第一步的go程序所在目錄,運行go程序
5.打開chrome瀏覽器訪問 localhost:8081
什么?竟然提示該網頁無法正常運作!
哦,低級錯誤,應該訪問:https://localhost:8081
又提示“您的連接不是私密連接”,忽略,終於顯示Hi, This is an example of https service in golang!
也算是基本打通了https。
然而,瀏覽器地址欄上大大的紅色“不安全”字樣看着不舒服。怎么辦?
辦法1:花錢申請證書或免費證書
辦法2:自簽證書,在客戶端,將證書導入到“受信任的根證書頒發機構”存儲區中
另外,還可以雙向驗證。
補充:
6.符合Chrome58+的證書制作(費了不少勁)
首先設置windows環境變量,我的是 D:\OpenSSL-Win64\bin
主要參考了https://blog.csdn.net/wdydxf/article/details/54576063,可能是openssl版本不同,稍做修改。如不明白,請看原文
下面的操作, 我將建立一個 MyRootCA 的根證書頒發機構, 然后為一個域名是 myserver.com 簽發證書
6.1將 C:\OpenSSL-Win64\bin\openssl.cfg 復制到 F:\SSLTest\, 並在F:\SSLTest\執行以下命令
mkdir demoCA\private demoCA\newcerts type nul > demoCA\index.txt echo 01 > demoCA\serial
6.2生成CA自簽名證書
openssl req -new -x509 -newkey rsa:2048 -days 3650 -keyout demoCA\private\MyRootCA.key -out demoCA\MyRootCA.crt -passout pass:123456 -config openssl.cnf
依次輸入 CN bj0 bj1 bj2 MyRootCA 空(回車)
6.3生成用戶的 RSA 密鑰對
openssl genrsa -des3 -out myserver.com._has_passwd.key -passout pass:123456
6.4 刪除私鑰中的密碼(否則golang程序無法啟動)
openssl rsa -in myserver.com._has_passwd.key -out myserver.com.key
6.5生成用戶證書請求
openssl req -new -days 1825 -key myserver.com.key -out myserver.com.csr -config openssl.cnf
依次輸入 123456 CN bj0 bj1 bj2 bjbj myserver.com 空(回車) 空(回車) 空(回車)(注意與6.2的相關輸入內容保持一樣)
6.6使用 CA 簽發用戶證書
openssl ca -in myserver.com.csr -out myserver.com.crt -cert demoCA\MyRootCA.crt -keyfile demoCA\private\MyRootCA.key -extensions v3_req -config openssl.cnf
依次輸入 123456 y y
6.7驗證
在C:\Windows\System32\drivers\etc\hosts中新增一行
127.0.0.1 myserver.com
然后將 MyRootCA.crt 安裝到 受信任的根證書頒發機構
將myserver.com.crt和myserver.com.key放到golang源代碼目錄下
訪問:https://myserver.com:8081/
終於顯示連接是安全的了。
補充:有的源碼不是用.crt 和.key格式的證書和私鑰,而都是用.pem后綴的。有的說法是.crt后綴可直接改為.pem,而.key可以轉換格式,
如:openssl rsa -in id_rsa -text > private.pem 。
但我沒有測試。
重點來了
自簽名不推薦,自己是自己擁有域名的話,直接去騰訊雲簽一個時長一年的專業CA機構簽發的dv類型證書就完事了
https://cloud.tencent.com/product/ssl
還有這里https://wzfou.com/letsencrypt/和https://www.cnblogs.com/tv151579/p/8268356.html介紹的:letsencrypt免費SSL證書
最后,聽說go https 在速度上不如Nginx + go http 方式
參考:https://segmentfault.com/a/1190000013287122
https://segmentfault.com/a/1190000009666888
https://segmentfault.com/a/1190000016249967
https://blog.csdn.net/zhaotengfei36520/article/details/41962077
https://studygolang.com/articles/9267
https://studygolang.com/articles/9959
https://blog.51cto.com/colinzhouyj/1566438
https://blog.csdn.net/luyangbin01/article/details/50972693
https://blog.csdn.net/sunhuansheng/article/details/82902185
https://blog.csdn.net/mixika99/article/details/79009521
https://blog.csdn.net/huplion/article/details/52892869
https://www.cnblogs.com/274914765qq/p/4672108.html
https://blog.csdn.net/c_base_jin/article/details/81229643
http://www.mamicode.com/info-detail-1938899.html
