2015-12-10 34 views
5

Tôi đang sử dụng x/crypto/pkcs12 để tải tệp * .p12 được định dạng DER. Có an example in the documentation sử dụng tls.X509KeyPair để tạo tls.Certificate có thể được sử dụng cho ứng dụng khách HTTP.Làm thế nào để biến một x509.Certificate thành một tls.Certificate trong Go?

Điều đó hoàn hảo và hoạt động tốt. Nhưng sau đó tôi cũng muốn xác minh rằng chứng chỉ chưa hết hạn. Thư viện pkcs12 cũng có Decode function trả về chứng chỉ x509, mà tôi có thể sử dụng phương thức Verify. Điều này cũng hoạt động tốt.

Điều đó dường như kỳ quặc đối với tôi khi tôi giải mã DER hai lần. Một lần cho một số x509.Certificate để xác minh và một lần nữa để nhận được tls.Certificate. Tôi không biết mối quan hệ giữa hai cấu trúc chứng chỉ này, nhưng nhìn thấy khi gói tls có một hàm có tên tls.X509KeyPair nhận một số byte, không nên có một cách rõ ràng để có được một tls.Certificate từ một x509. Giấy chứng nhận hoặc visa ngược lại? Tôi đang thiếu gì?

Trả lời

3

Một tls.Certificate thường lưu trữ chứng chỉ chuỗi - nói cách khác,> 1 chứng chỉ. Để ý trường Certificate của nó thuộc loại [][]byte, trong đó mỗi chứng chỉ là []byte.

Gói tls nhập gói x509, vì vậy không có hàm nào trong x509 để nhận được một chứng chỉ tls.Certificate; điều đó sẽ gây ra chu kỳ nhập. Nhưng nếu bạn có chứng chỉ x509.Certificate, bạn đã có một chứng chỉ tls.Certificate; chỉ cần đặt các số thứ tự của x509.Certificate's Raw vào một tls.Các chứng nhận số Certificate lát.

+0

Cảm ơn Matt. Tôi sẽ thử. Tôi có cần phải làm bất cứ điều gì với các lĩnh vực khác của tls.Certificate hoặc gọi bất kỳ chức năng, hoặc nó nên "chỉ làm việc"? Tôi nhận thấy rằng x509.Certificate.Verify() cũng trả về chuỗi. – nathany

+0

Máy chủ TLS sẽ cần trường 'PrivateKey' được đặt thành công để hoàn thành việc bắt tay. Tôi nghĩ phần còn lại là tùy chọn. – Matt

+0

Có vẻ như tôi cần khóa riêng tư cho khách hàng. Nhìn vào nó. tls: khóa chứng chỉ ứng dụng khách riêng tư không thực hiện crypto.Signer – nathany

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