1 回答

TA貢獻1817條經(jīng)驗 獲得超14個贊
您似乎將證書頒發(fā)機構(gòu)與客戶端證書混淆了??蛻舳俗C書向服務(wù)器證明你就是你所說的那個人(很像用戶名和密碼),并且使用 CA 以便你知道你正在與正確的服務(wù)器對話。
從適用于您的 openssl 命令來看,您的銀行給了您一個客戶證書和密鑰(盡管這是非常不尋常的;除了您自己,沒有人應(yīng)該持有您的私鑰,尤其是密碼)。
如果客戶端使用該tls.Config.Certificates
字段,則用于配置客戶端證書。
證書包含一個或多個證書鏈以呈現(xiàn)給連接的另一端。[...] 進行客戶端身份驗證的客戶端可以設(shè)置證書或 GetClientCertificate。
TLS 證書通常使用tls.LoadX509KeyPair或tls.X509KeyPair加載。但是,這些函數(shù)不直接支持加密密鑰。
相反,您必須自己加載密鑰,使用x509.DecryptPEMBlock對其進行解密,然后您可以使用 tls.X509KeyPair。
以下示例使用 EC 密鑰,因為它的編碼很短,但它與 RSA 密鑰的工作方式相同。
package main
import (
? ? "crypto/tls"
? ? "crypto/x509"
? ? "encoding/pem"
? ? "fmt"
? ? "log"
? ? "net/http"
)
var bundle = []byte(`
-----BEGIN EC PRIVATE KEY-----
Proc-Type: 4,ENCRYPTED
DEK-Info: AES-256-CBC,99586A658F5D2DAC4A8A3CA387CF71CE
25EtKb7ycOI/5R47fYwpiaNERgYnCxCtcrMXJuOgueuxUXjiU0n93hpUpIQqaTLH
dDKhsR1UHvGJVTV4h577RQ+nEJ5z8K5Y9NWFqzfa/Q5SY43kqqoJ/fS/OCnTmH48
z4bL/dJBDE/a5HwJINgqQhGi9iUkCWUiPQxriJQ0i2s=
-----END EC PRIVATE KEY-----
-----BEGIN CERTIFICATE-----
MIIB2TCCAX+gAwIBAgIUUTZvgwwnbC05WHgIHMXxrbZzr6wwCgYIKoZIzj0EAwIw
QjELMAkGA1UEBhMCWFgxFTATBgNVBAcMDERlZmF1bHQgQ2l0eTEcMBoGA1UECgwT
RGVmYXVsdCBDb21wYW55IEx0ZDAeFw0xOTA1MTQxMzAwMDJaFw0xOTA1MTUxMzAw
MDJaMEIxCzAJBgNVBAYTAlhYMRUwEwYDVQQHDAxEZWZhdWx0IENpdHkxHDAaBgNV
BAoME0RlZmF1bHQgQ29tcGFueSBMdGQwWTATBgcqhkjOPQIBBggqhkjOPQMBBwNC
AAScgLGx6SXchEo/s0X3AoF0mQkh3bGf9QY0s/2dPqf3/9irwz35DiDGoaP+FDZv
HnUX+D3tUEPhxkLyzWKKT9HHo1MwUTAdBgNVHQ4EFgQU3eB8oRcmvzZrx9Dkb6ma
MMtu1MkwHwYDVR0jBBgwFoAU3eB8oRcmvzZrx9Dkb6maMMtu1MkwDwYDVR0TAQH/
BAUwAwEB/zAKBggqhkjOPQQDAgNIADBFAiAvw/FqAmGbSlBklp6AHJy9kf9VPyhe
RA93ccNQ+7m1fAIhAOXr8c2QsH2oOYRTbn6bPZjkYQ2jLMaxatKhChBIuyZA
-----END CERTIFICATE-----
`)
func main() {
? ? keyBlock, certsPEM := pem.Decode(bundle)
? ? fmt.Println(x509.IsEncryptedPEMBlock(keyBlock)) // Output: true
? ? // Decrypt key
? ? keyDER, err := x509.DecryptPEMBlock(keyBlock, []byte("foobar"))
? ? if err != nil {
? ? ? ? log.Fatal(err)
? ? }
? ? // Update keyBlock with the plaintext bytes and clear the now obsolete
? ? // headers.
? ? keyBlock.Bytes = keyDER
? ? keyBlock.Headers = nil
? ? // Turn the key back into PEM format so we can leverage tls.X509KeyPair,
? ? // which will deal with the intricacies of error handling, different key
? ? // types, certificate chains, etc.
? ? keyPEM := pem.EncodeToMemory(keyBlock)
? ? cert, err := tls.X509KeyPair(certsPEM, keyPEM)
? ? if err != nil {
? ? ? ? log.Fatal(err)
? ? }
? ? config := &tls.Config{
? ? ? ? Certificates: []tls.Certificate{cert},
? ? }
}
- 1 回答
- 0 關(guān)注
- 182 瀏覽
添加回答
舉報