Golang能夠用很短的代碼實現HTTP和HTTPS服務html
HTTP是基於傳輸層TCP協議的。安全
package main import ( "net/http" "fmt" "log" ) func main() { http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request){ fmt.Fprint(w, "Hello world") }) log.Fatal(http.ListenAndServe(":5001", nil)) }
HTTPS服務不一樣於HTTP服務,HTTPS是HTTP over SSL或HTTP over TLS。post
SSL是「Secure Sockets Layer」的縮寫,中文叫作「安全套接層」。它是在上世紀90年代中期,由NetScape公司設計的。爲啥要發明 SSL 這個協議捏?由於原先互聯網上使用的 HTTP 協議是明文的,存在不少缺點——好比傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是爲了解決這些問題。
到了1999年,SSL 由於應用普遍,已經成爲互聯網上的事實標準。IETF 就在那年把 SSL 標準化。標準化以後的名稱改成 TLS是「Transport Layer Security」的縮寫,中文叫作「傳輸層安全協議」。
不少相關的文章都把這二者並列稱呼(SSL/TLS),由於這二者能夠視做同一個東西的不一樣階段。 參考
要啓用HTTPS首先須要建立私鑰和證書。設計
有兩種方式生成私鑰和證書:code
openssl genrsa -out key.pem 2048 openssl req -new -x509 -key key.pem -out cert.pem -days 3650
go run $GOROOT/src/crypto/tls/generate_cert.go --host localhost
將生成的key.pem、cert.pem和如下代碼放在同一目錄下server
package main import ( "log" "net/http" ) func handler(w http.ResponseWriter, req *http.Request) { w.Header().Set("Content-Type", "text/plain") w.Write([]byte("This is an example server.\n")) } func main() { http.HandleFunc("/", handler) log.Printf("About to listen on 10443. Go to https://127.0.0.1:10443/") // One can use generate_cert.go in crypto/tls to generate cert.pem and key.pem. // ListenAndServeTLS always returns a non-nil error. err := http.ListenAndServeTLS(":10443", "cert.pem", "key.pem", nil) log.Fatal(err) }
(END)htm