Golang代碼實現HTTPs(HTTPS證書生成和部署)

在win7下試試:html

1.實現一個最簡單的HTTPS Web Servergit

// 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.keygolang

二、安裝opensslweb

2.1可到http://slproweb.com/products/Win32OpenSSL.html下載Win64 OpenSSL v1.1.0j。好像該地址應該能夠下載Visual C++ 2008Redistributables (x64)的  可是我沒找到。直接安裝下載的  Win64 OpenSSL v1.1.0jchrome

注:我是直接下載安裝了,略過了下面的2.2和2.3segmentfault

2.2下載Openssl源碼,去官網http://www.openssl.org/下載openssl-1.1.0j.tar.gz便可。windows

 解壓openssl-1.0.1j.tar.gz,找到\openssl-1.0.1j\apps目錄,拷貝demoCA目錄和openssl.cnf文件到Openssl的安裝目錄下的bin目錄下(即D:\OpenSSL-Win64\bin\)。瀏覽器

2.三、在D:\OpenSSL-Win64\bin目錄下,建立ca、jks、server、client四個目錄。 安全

三、生成 server.key和server.crtapp

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/http://www.javashuo.com/article/p-wwsjekur-em.html介紹的:letsencrypt免費SSL證書

 最後,據說go https 在速度上不如Nginx + go http 方式

 

參考:http://www.javashuo.com/article/p-ylrbjmhc-gx.html

http://www.javashuo.com/article/p-utwtzwos-be.html

http://www.javashuo.com/article/p-nklcgutn-cw.html

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

http://www.javashuo.com/article/p-qyaqdwjs-dy.html

https://blog.csdn.net/mixika99/article/details/79009521

https://blog.csdn.net/huplion/article/details/52892869

https://douhan.li/?p=79

http://www.javashuo.com/article/p-zzymjkaf-et.html

https://blog.csdn.net/c_base_jin/article/details/81229643

http://www.mamicode.com/info-detail-1938899.html

https://blog.csdn.net/wdydxf/article/details/54576063

https://blog.csdn.net/qq_37049781/article/details/84837342

相關文章
相關標籤/搜索