支付宝RSA2公钥证书生成办法
生活随笔
收集整理的這篇文章主要介紹了
支付宝RSA2公钥证书生成办法
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
支付寶RSA2公鑰證書生成
前言
支付寶新的轉賬接口例如轉賬“alipay.fund.trans.uni.transfer”接口已經在推新的公鑰證書模式,由支付寶作為CA幫我們的公鑰做簽發這樣可以在與支付寶通訊時防止通信內容內容被篡改,因此安全性得到了提升,雙向通信都需要做驗證,但是我們通常在測試情況下需要自身mock支付寶的返回,以此驗證各種情況下程序的正確性,生產可以直接下載支付寶CA簽名好的公鑰,這樣就需要我們類似于支付寶做一個自簽名的公鑰證書,自簽發后提供給我們的測試程序使用,同時私鑰由mock程序持有來模擬支付寶服務端做簽名,下面將分別介紹兩種借助支付寶開放平臺開發助手和openssl來生成公鑰證書,并且第三節提供了測試代碼可以用于測試公私鑰
支付寶開放平臺開發助手生成
支付寶開放平臺開發助手使用介紹以及下載地址
上述文檔可以指導我們配置生產證書,但是要用它做mock還需要自簽名拿到公鑰證書,進行下面步驟
使用openssl生成
通常mac電腦自帶openssl無需額外安裝
-inform PEM -in server.crt -outform PEM -nocrypt 可以生成不帶密碼的PKCS8格式的證書,可以保持為文件,這里演示保存為testprivate_pkcs8.key
并根據提示輸入證書信息,得到包含自身信息的證書請求文件用于請求CA為自己的公鑰做簽名,最后一個是密碼不需要直接回車跳過
server.crt -days
3650,這樣可以用自己的私鑰代替CA為自己做簽名,證書有效期10年足夠使用了,注意這個不是受信任的CA簽發的證書所以無法在生產環境受信任但是測試環境沒問題
server.crt(pkcs1)和3中生成的testprivate_pkcs8.key
測試代碼(golang)
下附測試證書
package mainimport ("crypto""crypto/rand""crypto/rsa""crypto/sha256""crypto/x509""encoding/base64""encoding/json""encoding/pem""errors""fmt""io/ioutil" )func main() {// 待簽名參數集params := "123123123,模擬待簽名參數"// 從文件加載公鑰證書err := LoadPublicCertFromFile("test_pub.pem")if err != nil {fmt.Println("LoadPublicCertFromFile, err=", err)return}// 加載私鑰err = LoadPrivateCertFromFile("test_pri.crt")if err != nil {fmt.Println("LoadPrivateCertFromFile, err=", err)return}jsonData, err := json.Marshal(params)if err != nil {fmt.Println("json.Marshal failed, err=", err)return}signature, err := sign(jsonData)if err != nil {fmt.Println("sign failed, err=", err)return}fmt.Println("signature=", signature)err = verify(params, signature)if err != nil {fmt.Println("verify failed, err=", err)return}fmt.Println("sign and verify success!") }// sign 生成簽名 func sign(data []byte) (signature string, err error) {hash := sha256.New()hash.Write(data)digest := hash.Sum(nil)rsaSign, err := rsa.SignPKCS1v15(rand.Reader, c.privateKey, crypto.SHA256, digest)if err != nil {return}signature = base64.StdEncoding.EncodeToString(rsaSign)return }// verify 驗簽 func verify(params, sign string) (err error) {b, err := base64.StdEncoding.DecodeString(sign)if err != nil {return}jsonData, err := json.Marshal(params)if err != nil {fmt.Println(err)return}hash := sha256.New()hash.Write(jsonData)digest := hash.Sum(nil)return rsa.VerifyPKCS1v15(c.publicKey, crypto.SHA256, digest, b) }// Cli 公私鑰 type Cli struct {publicKey *rsa.PublicKey // 支付寶公鑰privateKey *rsa.PrivateKey // 私鑰 }var c Cli// LoadPublicCertFromFile 從指定路徑加載支付寶公鑰 func LoadPublicCertFromFile(p string) (err error) {b, err := ioutil.ReadFile(p)if err != nil {return}block, _ := pem.Decode(b)if block == nil {return errors.New("certificate failed to load")}// 這里先解析為x509格式證書方便我們提取證書sn,演示不做提取csr, err := x509.ParseCertificate(block.Bytes)if err != nil {fmt.Println("x509.ParseCertificate failed, err=", err)return}var ok boolc.publicKey, ok = csr.PublicKey.(*rsa.PublicKey)if !ok {err = errors.New("csr.PublicKey failed")}return }// LoadPrivateCertFromFile 從指定路徑加載支付寶私鑰 func LoadPrivateCertFromFile(p string) (err error) {cont, err := ioutil.ReadFile(p)if err != nil {return}block, _ := pem.Decode(cont)if block == nil {return fmt.Errorf("decode public key file fail")}// 這里推薦用PKCS8格式的私鑰key, err := x509.ParsePKCS8PrivateKey(block.Bytes)if err != nil {return}var ok boolc.privateKey, ok = key.(*rsa.PrivateKey)if !ok {err = errors.New("cert.PublicKey failed")}return } // 附測試證書一對,僅供測試使用 // 公鑰證書 server_pem.crt-----BEGIN CERTIFICATE----- MIIDgjCCAmoCCQDVk64MUGbLHzANBgkqhkiG9w0BAQUFADCBgjELMAkGA1UEBhMC Q04xCzAJBgNVBAgMAkJKMQswCQYDVQQHDAJCSjEUMBIGA1UECgwLdGVzdGNvbXBh bnkxDTALBgNVBAsMBHRlc3QxFjAUBgNVBAMMDXRlc3QudGVzdC5jb20xHDAaBgkq hkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wHhcNMjAwNTI4MTAyMTE4WhcNMzAwNTI2 MTAyMTE4WjCBgjELMAkGA1UEBhMCQ04xCzAJBgNVBAgMAkJKMQswCQYDVQQHDAJC SjEUMBIGA1UECgwLdGVzdGNvbXBhbnkxDTALBgNVBAsMBHRlc3QxFjAUBgNVBAMM DXRlc3QudGVzdC5jb20xHDAaBgkqhkiG9w0BCQEWDXRlc3RAdGVzdC5jb20wggEi MA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQC4n/5sN2WE2SqpRcNoyRMNoQnt vVoVb1jrR9XX5TOjw3LdYBVQBLevXPsgk8cFTRoy0f+TaftoWaRSpVAlNPcLAoXF j6MNi/Sp56j8tx1jBM9ExV5cWAsgvNgV36ZrDNnw6cf3kKX/J3TOViyDKVHOKRLX k6wiAH/9avfA0dDF8SDFb6h6ISQuFcd1c5zKOTi264BJd0pWY4ScxrKP0KhBu+bx eVbq7GNQu/SZxzXO6213It9FBMZPnmDm2Dmz2wrbYvc/uPfqLV8DGRvAiAz95P3i fwiZUtilWiPdPO2NB5IysIJqE02xAM0ySxcVFXlqthxCP4TgYqELbuHOhVb3AgMB AAEwDQYJKoZIhvcNAQEFBQADggEBAC3N5TsJQX/Z06LDCKQDH+UV2QtG6xRTlqhK BQBVlEkVNPyKURX8QgSOIy3rA3JkfDFwsOuaD4O2Xux80r7HVq80NWjguTcFBS5Q nHsCc4j3v5PXqmyPAOhybnKDE9ZRZJEsWwqTrWI2RQ/96BKzIep02DUHxR9/Hj5i +LcRCAhROE2SHByuRW0oeDXNIrlihguCP5m4ABLXoz+no9rvyFPiX//zRXR2pyV3 w9NHLjGRJLYITc0Ic5zHU3kPv/uw+GIQ4z4L0MJfir6xXVYj3jiqHo987TWd0Ir+ qlSBgpz3o7GLgLjtViAUt/Z0dHUbkmLHaaH0DAxriTx4khU+Dmk= -----END CERTIFICATE-----// PKCS8格式私鑰 testprivate_pkcs8.crt -----BEGIN PRIVATE KEY----- MIIEvgIBADANBgkqhkiG9w0BAQEFAASCBKgwggSkAgEAAoIBAQC4n/5sN2WE2Sqp RcNoyRMNoQntvVoVb1jrR9XX5TOjw3LdYBVQBLevXPsgk8cFTRoy0f+TaftoWaRS pVAlNPcLAoXFj6MNi/Sp56j8tx1jBM9ExV5cWAsgvNgV36ZrDNnw6cf3kKX/J3TO ViyDKVHOKRLXk6wiAH/9avfA0dDF8SDFb6h6ISQuFcd1c5zKOTi264BJd0pWY4Sc xrKP0KhBu+bxeVbq7GNQu/SZxzXO6213It9FBMZPnmDm2Dmz2wrbYvc/uPfqLV8D GRvAiAz95P3ifwiZUtilWiPdPO2NB5IysIJqE02xAM0ySxcVFXlqthxCP4TgYqEL buHOhVb3AgMBAAECggEASoeL1XOnb7GbHyoicDJ7lozjzS0bKHwCkTg2gyjrZ7iG rgcTk3HUFN6cIdKGDQXLBajwWzn1W3KUeyhw6hQvhipGhjItyFIvOkdiWGIzYr2W TlS+etiv5U9Wi731GFHfyPkW2EF0QURUStdOsMQFWgwKpyvd2PwKrup3iUcp2D2G FCTlV0sk4kQNLOywQTm7BdY6A7vN5W6Nq29/6d7RBNrZ76ueubSECiAifx8GJN2i 8R7R9gvO/I0lEFKgqYl2f5zzhQl8yhxvDyHA6i5ylooe6TrOOO7WgiQLnKiwxJYN YMYnK8mcoIeFVRH4+580z1sOxl0lkjmDfxToH8ECwQKBgQD0sfNdF5r+5DVTYgdh hP9rd/mVnxht1I1QaAtp0H1aIaL+uBXn/d4q4xVCFUMcASEMO0/OmxGAM73Gw5Ja /1DwOZQXProIrmvEAj3MwcwfmvWATcKJ/iz0Nf51tG1Z/RQtryNizMuPgrol9imn OrAhjv8JUSZHr/1OFWcBPgpG2wKBgQDBJ5VwWNfGQJQNunV4hewxuvI6TZNA0hHH 41Jvv+EsLwAR2OE+Gu3iXB2iWIgTQ383DnG6nM/ZHCWjOC1SKbhRgaYgUEtScLGl uqLz1/UCx/1LYsoMADLTUUw4QTs0EBQKkrCUGZh6qDyIdUReTdCN0/mqf/ZdoWzu tRQdrKXFFQKBgGXb4bOBzQqH0s7oAqyMoYqKAcJP3OpzTXQIK6AbouKvF9uyo6PT 4PS3XLUKhsoUij4+PmWB1ZIpd7lS1gy9NWMahNP8T5KnkMKiMDmY/rC1X7bOJ8or nWj3RPqYZeDM4eZ2fmN1XtNZlsWQqBwt6P2/OdkWB7pVvzsO27b/rWV7AoGBAJNk e1qh0PYN7WyUbnOr7lL8jz8CV23NX5gi1ZNE3rTyoKD92NOlhQWIuWxbFmtsxDTl Js/6PXk1S1tD0QGzqF06C+T4oKGmMUmAJDzi/KpEpfrSxc9mj2JF1V3QGTdfVYvD 6E77QSnIG3kd0zALPSwdJ5V91CgauJ9nOpRyXIUJAoGBAMdoNu5G9hZkbp3nLhfI LWQOw9NwogUDkFCEtPf4oXc3rbqIol5QalE5WFqjNF2KIJeJJoJeNuuEyTse7m4G EZAR9JGjDdsxoVbQ/hOIJUyPKyxvONykgD3viWBBCUOtLJbMuDe2a/lWtddPWBTL zvxp7g5zMDSkZDM4hrbo5YBn -----END PRIVATE KEY-----總結
以上是生活随笔為你收集整理的支付宝RSA2公钥证书生成办法的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 分析ajax爬取果壳网
- 下一篇: 收深圳2022年的高新技术企业(软件开发