2 回答

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

TA貢獻1784條經驗 獲得超9個贊
您可以使用供應商的 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 關注
- 186 瀏覽
添加回答
舉報