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

Golang能夠用很短的代碼實現HTTP和HTTPS服務html

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。post

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

要啓用HTTPS首先須要建立私鑰和證書。設計

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

  • 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

將生成的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

相關文章
相關標籤/搜索