2014-05-06 22 views
9

Sau đây là tls tôi backend:Golang ListenAndServeTLS trả về dữ liệu khi không sử dụng https trong trình duyệt

package main 

import (
    "fmt" 
    "net/http" 
) 

const (
    PORT  = ":8443" 
    PRIV_KEY = "./private_key" 
    PUBLIC_KEY = "./public_key" 
) 

func rootHander(w http.ResponseWriter, r *http.Request) { 
    fmt.Fprint(w, "Nobody should read this.") 
} 

func main() { 
    http.HandleFunc("/", rootHander) 
    err := http.ListenAndServeTLS(PORT, PUBLIC_KEY, PRIV_KEY, nil) 
    if err != nil { 
     fmt.Printf("main(): %s\n", err) 
    } 
} 

Các phím được tạo bằng hai dòng sau:

openssl genrsa -out private_key 2048 
openssl req -new -x509 -key private_key -out public_key -days 365 

Khi tôi khởi động server tls và truy cập trang web bằng trình duyệt (https://example.com:8443) Tôi nhận được kết quả mong đợi, sau bỏ qua cảnh báo trình duyệt:

Nobody should read this. 

Cho đến giờ mọi thứ đều tuyệt vời.

Bây giờ, khi tôi chỉ trình duyệt của tôi để http://example.com:8443 (chú ý rằng http được sử dụng, không https) tôi nhận được kết quả sau cho Firfox (Chrome cũng làm như vậy, nhưng tải trang web):

using http

Câu hỏi: Tại sao có dấu chấm hỏi?

+0

Liệu https://groups.google.com/forum/#!topic/golang-nuts/ZtP5vPPeyHE công việc cho bạn quá ? – ddevienne

Trả lời

9

Nếu bạn đặt đầu ra thành od, curl -k -3 http://localhost:8443 | od -A n -t x1, bạn nhận được chuỗi byte sau 15 03 01 00 02 02 0a được trình duyệt/xử lý.

Mà, theo https://code.google.com/p/go/issues/detail?id=2253, là TLS cho "Tôi không hiểu những gì bạn đã nói".

+2

Vì vậy, đó là do thiết kế. Nếu tôi muốn cho phép chỉ https, tôi nên chuyển hướng, phải không? – Kiril

+0

@Kiril Có giải pháp nào cho vấn đề này không? Ý bạn là gì bởi "chuyển hướng"? – codepushr

+0

Đây thực sự là hành vi được mong đợi. Bạn có thể kiểm tra https://golang.org/pkg/net/http/#Request (TLS) để biết liệu yêu cầu có sử dụng http hay https hay không. – Kiril

4

Nếu ở tất cả vẫn có liên quan:

http.ListenAndServeTLS(...) mất chứngtin chính không công & tin chính.

+0

Cảm ơn bạn đã làm rõ. Vậy tôi đã tạo chứng chỉ với khóa riêng tương ứng? – Kiril

+1

Có.Bạn đã tạo chứng chỉ với khóa riêng tư. Bạn chỉ cần đặt tên là "public_key". Thông thường nó được thực hiện giống như thế này: '-out cert.pem'. – SunSparc

1

Dưới đây là một số mã để chuyển hướng các yêu cầu trên cổng 80 đến 443 và để phân phát các chứng chỉ tls bằng cách sử dụng CA như cho phép mã hóa. Tôi biết rằng với mã hóa cho phép (letsencrypt.org) bạn muốn tham khảo tệp fullchain.pem kết quả cũng như tệp privkey.pem.

Vấn đề lớn nhất với việc tự ký là nó sẽ không khả thi trong sản xuất. Với golang, chúng tôi thực sự cấu hình các ứng dụng của chúng tôi khá đặc biệt để một cái gì đó đơn giản như gắn các tls certs đúng là một chủ đề quan trọng khi chúng ta sẵn sàng để khởi động.

đây một số mã đơn giản, tôi đã thực sự sử dụng để khởi động một trang web tĩnh:

package main 
import (
"net/http" 
"log" 
) 
func redirect(w http.ResponseWriter, req *http.Request) { 
// remove/add not default ports from req.Host 
target := "https://" + req.Host + req.URL.Path 
if len(req.URL.RawQuery) > 0 { 
    target += "?" + req.URL.RawQuery 
} 
log.Printf("redirect to: %s", target) 
http.Redirect(w, req, target, 
     http.StatusTemporaryRedirect) 
} 


func main() { 
//define a variable for the FileServer directory in this case ./static/ 
var fs = http.FileServer(http.Dir("static")) 
//express the handler function 
http.Handle("/", fs) 
//We should redirect requests on port 80 
go http.ListenAndServe(":80", http.HandlerFunc(redirect)) 
//finally we Listen for requests and serve them up on a specific port 
http.ListenAndServeTLS(":443", "fullchain.pem", "privkey.pem", nil) 

} 
Các vấn đề liên quan