我嘗試使用 Go 的 rsa 和 x509 包生成一對 PKCS8 編碼的私鑰和相應的 PKCS1 編碼的公鑰。我希望具有與以下 openssl 命令相同的行為:$ openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt$ openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub我在下面添加了我的 Go 實現,歸結為要點。為了使用它,我首先使用GeneratePrivateKey生成一個私鑰(最后附上的示例的位大小為2048),然后使用以下兩種方法對私鑰和公鑰進行編碼。但是,當運行第二個 openssl 命令以在由我的 Go 實現編碼的私鑰上對公鑰進行編碼時,公鑰不同(我在下面提供了一個差異示例)。特別是,它看起來好像 openssl 輸出通過前綴擴展了我的 Go 實現的輸出。我將不勝感激對差異的任何解釋(在最好的情況下,我將如何修復我的代碼)。非常感謝你!我的 Go 代碼如下所示:package xyzimport ( "crypto/rand" "crypto/rsa" "crypto/x509" "encoding/pem")func GeneratePrivateKey(bitSize int) (*rsa.PrivateKey, error) { privateKey, err := rsa.GenerateKey(rand.Reader, bitSize) if err != nil { return nil, err } err = privateKey.Validate() if err != nil { return nil, err } return privateKey, nil}func EncodePrivateKeyToPEM(privateKey *rsa.PrivateKey) (string, error) { privateDER, err := x509.MarshalPKCS8PrivateKey(privateKey) if err != nil { return "", err } privateBlock := pem.Block{ Type: "RSA PRIVATE KEY", Headers: nil, Bytes: privateDER, } privatePEM := pem.EncodeToMemory(&privateBlock) return string(privatePEM), nil}
1 回答

慕蓋茨4494581
TA貢獻1850條經驗 獲得超11個贊
OpenSSL 語句生成 PKCS#8 格式的私鑰和 X.509/SPKI 格式的公鑰,均采用 PEM 編碼。
使用 Go Code 生成的私鑰具有 PKCS#8 格式,但 PEM 編碼使用了錯誤的頁眉和頁腳(正確的是-----BEGIN PRIVATE KEY-----和-----END PRIVATE鍵----- )。解決方法是EncodePrivateKeyToPEM()
在pem.Block()
調用中相應地調整類型 ( Type: "PRIVATE KEY"
)。
對于使用 Go 代碼生成的公鑰,情況正好相反:這里,頁眉和頁腳對應于 PEM 編碼的 X.509/SPKI 密鑰的頁眉和頁腳。但是,正文是 PKCS#1 格式的。這就是密鑰不同的原因。解決方法是在EncodePublicKeyToPEM()
方法MarshalPKIXPublicKey()
中使用 X.509/SPKI 格式而不是MarshalPKCS1PublicKey()
.
順便說一句,檢查密鑰的最佳方法是使用 ASN.1 解析器,例如https://lapo.it/asn1js/。
- 1 回答
- 0 關注
- 182 瀏覽
添加回答
舉報
0/150
提交
取消