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 关注
- 151 浏览
添加回答
举报