2 回答

TA貢獻(xiàn)1825條經(jīng)驗(yàn) 獲得超4個(gè)贊
您為您指定的私鑰tls.Certificate
可以是任何實(shí)現(xiàn)的對象crypto.Signer
,根據(jù)文檔:
是可用于簽名操作的不透明私鑰的接口。例如,保存在硬件模塊中的 RSA 密鑰。
并且專門用于這種用途。
一旦您可以訪問底層密鑰,實(shí)現(xiàn)接口就相當(dāng)簡單了。例如, thalesignite/crypto11為 PKCS#11 密鑰提供了這樣的實(shí)現(xiàn)。

TA貢獻(xiàn)1784條經(jīng)驗(yàn) 獲得超9個(gè)贊
您可以使用供應(yīng)商的 PKCS11 文件 + crypto11庫。
package main
import (
"crypto/tls"
"fmt"
"io/ioutil"
"log"
"net/http"
"github.com/ThalesIgnite/crypto11"
)
func main() {
config := crypto11.Config{
Path: "C:\\Windows\\System32\\vendor-pkcs11.dll",
TokenSerial: "123456789456123",
Pin: "123456",
}
context, err := crypto11.Configure(&config)
if err != nil{
log.Fatalln(err)
}
certificates, err := context.FindAllPairedCertificates()
if err != nil{
log.Fatalln(err)
}
fmt.Println("total certificates: ", len(certificates))
cert := certificates[0]
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
Certificates: []tls.Certificate{cert},
Renegotiation: tls.RenegotiateOnceAsClient,
},
},
}
req, err := http.NewRequest("GET", "https://server.cryptomix.com:443/secure/", nil)
if err != nil {
log.Fatalln(err)
}
req.Header.Set("User-Agent", "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.135 Safari/537.36")
resp, err := client.Do(req)
if err != nil {
log.Fatalln(err)
}
fmt.Println("status code: ", resp.StatusCode)
if resp.StatusCode == http.StatusOK {
bodyBytes, err := ioutil.ReadAll(resp.Body)
if err != nil {
log.Fatal(err)
}
bodyString := string(bodyBytes)
fmt.Println(bodyString)
}
}
- 2 回答
- 0 關(guān)注
- 198 瀏覽
添加回答
舉報(bào)