视频一区二区三区自拍_千金肉奴隷1985未删减版在线观看_国产成人黄色视频在线播放_少女免费播放片高清在线观看_国产精品v欧美精品v

Login expired. Please log in again.

Feedback

0/300

Feedback

Submitted successfully

ok

Feedback

Network exception, please try again later

ok

證書相關(guān)

我們在【商戶平臺(tái)】->【自助服務(wù)】中設(shè)立了API證書及密鑰 專區(qū),包括了商戶證書如何升級,申請,下載等問題的解答。下面是商戶技術(shù)人員可能關(guān)心的一些問題。

1. 什么是私鑰?什么是證書?

數(shù)字簽名通常定義了兩種運(yùn)算: 簽名和驗(yàn)簽。發(fā)送者用自己的私鑰對消息的哈希值進(jìn)行簽名,接收者用對方的公鑰進(jìn)行驗(yàn)簽。因此,在使用數(shù)字簽名時(shí),需要通信的雙方都要事先生成公鑰、私鑰,并且完成雙方的公鑰交換。其中,私鑰是只能由擁有者使用的不公開密鑰,公鑰是可以公開的密鑰。

由于公鑰本身并不含有擁有者的身份信息,使用時(shí)無法確認(rèn)它是真實(shí)有效的。所以需要證書認(rèn)證機(jī)構(gòu)(簡稱 CA)在核實(shí)公鑰擁有者的信息后,將公鑰擁有者的身份信息(如商戶號、公司名稱等),公鑰、簽發(fā)者信息、有效期以及擴(kuò)展信息等進(jìn)行簽名,制作成“證書”。

2. 如何獲取API證書?

請參考什么是API證書?如何獲取API證書?

3. 什么是商戶證書?什么是平臺(tái)證書?

? “商戶證書”是指由商戶申請的,包含商戶的商戶號、公司名稱、公鑰信息的證書。

? “平臺(tái)證書”是指由微信支付負(fù)責(zé)申請的,包含微信支付平臺(tái)標(biāo)識(shí)、公鑰信息的證書。

商戶在調(diào)用 API 時(shí)用自身的私鑰簽名,微信支付使用商戶證書中的公鑰來驗(yàn)簽。微信支付在響應(yīng)的報(bào)文中使用自身的私鑰簽名,商戶使用平臺(tái)證書中的公鑰來驗(yàn)簽。

4. 為什么微信支付APIv3要用第三方CA的證書?

主要是為了符合監(jiān)管的要求,保證更高的安全級別。《中華人民共和國電子簽名法》、《金融電子認(rèn)證規(guī)范》及《非銀行支付機(jī)構(gòu)網(wǎng)絡(luò)支付業(yè)務(wù)管理辦法》中規(guī)定 “電子簽名需要第三方認(rèn)證的,由依法設(shè)立的電子認(rèn)證服務(wù)提供者提供認(rèn)證服務(wù)。”,所以需使用第三方 CA 來確保數(shù)字證書的唯一性、完整性及交易的不可抵賴性。

5. 什么是證書序列號

每個(gè)證書都有一個(gè)由CA頒發(fā)的唯一編號,即證書序列號。

6. 如何查看證書序列號?

登錄商戶平臺(tái)【API安全】->【API證書】->【查看證書】,可查看商戶API證書序列號。

商戶API證書和微信支付平臺(tái)證書均可以使用第三方的證書解析工具,查看證書內(nèi)容。或者使用openssl命令行工具查看證書序列號。

$ openssl x509 -in 1900009191_20180326_cert.pem -noout -serial
serial=1DDE55AD98ED71D6EDD4A4A16996DE7B47773A8C

7. 如何在程序中加載證書

推薦使用微信支付提供的SDK。你也可以查看下列編程語言的示例代碼。

/**
 * 獲取證書。
 *
 * @param filename 證書文件路徑  (required)
 * @return X509證書
 */
public static X509Certificate getCertificate(String filename) throws IOException {
	InputStream fis = new FileInputStream(filename);
	BufferedInputStream bis = new BufferedInputStream(fis);

	try {
		CertificateFactory cf = CertificateFactory.getInstance("X509");
		X509Certificate cert = (X509Certificate) cf.generateCertificate(bis);
		cert.checkValidity();
		return cert;
	} catch (CertificateExpiredException e) {
		throw new RuntimeException("證書已過期", e);
	} catch (CertificateNotYetValidException e) {
		throw new RuntimeException("證書尚未生效", e);
	} catch (CertificateException e) {
		throw new RuntimeException("無效的證書文件", e);
	} finally {
		bis.close();
	}
}
 /**
* Read certificate from file
*
* @param string    $filepath     PEM encoded X.509 certificate file path
* 
* @return resource|bool  X.509 certificate resource identifier on success or FALSE on failure
*/
public static function getCertificate($filepath) {
    return openssl_x509_read(file_get_contents($filepath));}
using System;
using System.IO;
using System.Net.Http;
using System.Security.Cryptography;
using System.Threading;
using System.Threading.Tasks;

namespace HttpHandlerDemo
{
    // 使用方法
    // HttpClient client = new HttpClient(new HttpHandler("{商戶號}", "{商戶證書序列號}"));
    // ...
    // var response = client.GetAsync("https://apihk.mch.weixin.qq.com/v3/global/certificates");
    public class HttpHandler : DelegatingHandler
    {
        private readonly string merchantId;
        private readonly string serialNo;

        public HttpHandler(string merchantId, string merchantSerialNo)
        {
            InnerHandler = new HttpClientHandler();

            this.merchantId = merchantId;
            this.serialNo = merchantSerialNo;
        }

        protected async override Task<HttpResponseMessage> SendAsync(
            HttpRequestMessage request,
            CancellationToken cancellationToken)
        {
            var auth = await BuildAuthAsync(request);
            string value = $"WECHATPAY2-SHA256-RSA2048 {auth}";
            request.Headers.Add("Authorization", value);

            return await base.SendAsync(request, cancellationToken);
        }

        protected async Task<string> BuildAuthAsync(HttpRequestMessage request)
        {
            string method = request.Method.ToString();
            string body = "";
            if (method == "POST" || method == "PUT" || method == "PATCH")
            {
                var content = request.Content;
                body = await content.ReadAsStringAsync();
            }

            string uri = request.RequestUri.PathAndQuery;
            var timestamp = DateTimeOffset.Now.ToUnixTimeSeconds();
            string nonce = Path.GetRandomFileName();

            string message = $"{method}\n{uri}\n{timestamp}\n{nonce}\n{body}\n";
            string signature = Sign(message);
            return $"mchid=\"{merchantId}\",nonce_str=\"{nonce}\",timestamp=\"{timestamp}\",serial_no=\"{serialNo}\",signature=\"{signature}\"";
        }

        protected string Sign(string message)
        {
            // NOTE: 私鑰不包括私鑰文件起始的-----BEGIN PRIVATE KEY-----
            //        亦不包括結(jié)尾的-----END PRIVATE KEY-----
            string privateKey = "{你的私鑰}";
            byte[] keyData = Convert.FromBase64String(privateKey);
            
            var rsa = RSA.Create();
            rsa.ImportPkcs8PrivateKey(keyData, out _);
            byte[] data = System.Text.Encoding.UTF8.GetBytes(message);
            return Convert.ToBase64String(rsa.SignData(data, HashAlgorithmName.SHA256, RSASignaturePadding.Pkcs1));
        }
    }
}

8. 為什么平臺(tái)證書只提供API下載?

主要是為了確保在更換平臺(tái)證書時(shí),不影響商戶使用微信支付的各種功能。以下場景中,微信支付會(huì)更換平臺(tái)證書:

? 證書到期后,必須更換。(目前是五年)

? 證書到期前,例行更換。(每年一次)

9. 為什么平臺(tái)證書下載接口返回的平臺(tái)證書需要加密?

主要是為了防御“中間人攻擊”。

由于驗(yàn)證應(yīng)答報(bào)文的簽名和加密敏感信息時(shí),必須使用到平臺(tái)證書。平臺(tái)證書是商戶認(rèn)證微信支付身份時(shí)最關(guān)鍵的要素。因此,要通過簽名和加密等多重機(jī)制來保障商戶獲取到的平臺(tái)證書沒有被“中間人”篡改。

商戶在調(diào)用下載接口獲取平臺(tái)證書時(shí),應(yīng)進(jìn)行以下四步操作,以保證證書的真實(shí)性:

? 使用與平臺(tái)共享的對稱密鑰,解密報(bào)文中的證書(必須)

? 通過解密得到的證書,來驗(yàn)證報(bào)文的簽名(必須)

? 使用證書查看工具,核對證書的頒發(fā)者為Tenpay.com Root CA。詳見如何區(qū)分API證書的類型?(強(qiáng)烈推薦)

? 通過證書信任鏈驗(yàn)證平臺(tái)證書(強(qiáng)烈推薦)

10. 如何通過證書信任鏈驗(yàn)證平臺(tái)證書?

下面介紹如何使用openssl工具,通過證書信任鏈驗(yàn)證平臺(tái)證書。

首先,從微信支付商戶平臺(tái)下載平臺(tái)證書信任鏈 CertTrustChain.p7b ,并將它轉(zhuǎn)換為pem證書格式。

openssl pkcs7 -print_certs -in CertTrustChain.p7b -inform der -out CertTrustChain.pem

然后,-CAfile file指定受信任的證書,驗(yàn)證下載的平臺(tái)證書

openssl verify -verbose -CAfile ./CertTrustChain.pem ./WeChatPayPlatform.pem 

11. 為什么報(bào)錯(cuò)“HTTP header缺少微信支付平臺(tái)證書序列號(Wechatpay-Serial)”?

商戶上送敏感信息時(shí)使用了微信支付平臺(tái)公鑰加密。為了能使用正確的密鑰解密,微信支付要求商戶在請求的HTTP頭部中包括證書序列號 ,以聲明加密所用的密鑰對和平臺(tái)證書。詳見這里的說明。

    Page Navigation

About  WeChat  Pay

Powered By Tencent & Tenpay Copyright©

2005-2024 Tenpay All Rights Reserved.

Contact Us
Wechat Pay Global

WeChat Pay Global

置頂