1. 程式人生 > >Golang建立最簡單的HTTP和HTTPS服務

Golang建立最簡單的HTTP和HTTPS服務

Golang可以用很短的程式碼實現HTTP和HTTPS服務

HTTP服務

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服務

HTTPS服務不同於HTTP服務,HTTPS是HTTP over SSL或HTTP over TLS。SSL

是“Secure Sockets Layer”的縮寫,中文叫做“安全套接層”。它是在上世紀90年代中期,由NetScape公司設計的。為啥要發明 SSL 這個協議捏?因為原先網際網路上使用的 HTTP 協議是明文的,存在很多缺點——比如傳輸內容會被偷窺(嗅探)和篡改。發明 SSL 協議,就是為了解決這些問題。到了1999年,SSL 因為應用廣泛,已經成為網際網路上的事實標準。IETF 就在那年把 SSL 標準化。標準化之後的名稱改為 TLS(是“Transport Layer Security”的縮寫),中文叫做“傳輸層安全協議”。很多相關的文章都把這兩者並列稱呼(SSL/TLS),因為這兩者可以視作同一個東西的不同階段。
參考

要啟用HTTPS首先需要建立私鑰和證書。

有兩種方式生成私鑰和證書:

  • OpenSSL方式,生成私鑰key.pem和證書cert.pem,3650代表有效期為10年
openssl genrsa -out key.pem 2048
openssl req -new -x509 -key key.pem -out cert.pem -days 3650
  • Golang標準庫crypto/tls裡有generate_cert.go,可以生成私鑰key.pem和證書cert.pem,host引數是必須的,需要注意的是預設有效期是1年
go run $GOROOT/src/crypto/tls/generate_cert.go --host localhost

程式碼

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)