微信支付使用HTTPS來保證通信安全, 在HTTPS服務器上部署了由權威機構簽發的證書, 用於證明微信支付平台的真實身份。
商戶與微信支付服務器通信前,商戶需要往客戶端的操作系統或者執行環境中部署權威機構的根CA證書,以便在調用微信支付API過程中, 驗證服務器及域名的真實合法性。
因微信支付HTTPS服務器證書的根CA證書將於2018年8月23日到期失效,微信支付計划於2018年5月29日, 更換服務器證書。若你的服務器上沒有部署新的根CA證書,將可能導致你的下單、退款等功能無法正常使用。
新的服務器證書由權威機構(DigiCert) 簽發,部分操作系統和執行環境中已經內置了該根CA證書。 為了提升兼容性, 微信支付的服務器上部署了DigiCert的交叉證書, 所以客戶端執行環境中包含以下兩個根CA中的任意一個即可。
DigiCert根CA證書兼容性列表如下:
A:微信支付HTTPS服務器證書是由權威機構頒發的證書。商戶調用微信支付API時,能通過該證書來認證微信支付的身份。
Q2:什么是根證書?
A:權威機構用它的“私鑰”來頒發服務器證書。 與“私鑰”相對應的是“公鑰”,“公鑰”被用來認證服務器證書的真實性。權威機構的公鑰會被制作成證書,簡稱“根證書”。
Q3:根證書和API證書是同一個嗎?
A:不是,兩者沒有關系。
“根證書”是用來校驗微信支付的域名及服務器的真實性, 通常內置在操作系統或者執行環境(如JRE等)中。
“API證書”是用來證實商戶身份的,通常在調用微信支付安全級別較高的接口(如:退款、企業紅包、企業付款等)時,才會使用到API證書。
Q4:微信支付為什么要更換服務器證書?
A:根證書存在有效期,根證書到期后無法繼續被用來校驗服務器證書。
因此微信支付申請了新的服務器證書。避免在根過期后商戶調用微信支付API時出現問題,新的證書計划於2018年5月29日更換。
Q5:微信支付更換服務器證書需要商戶配合做哪些事情?
A:僅需開發人員在調用微信支付API的服務器上,確認是否已部署用於驗證微信支付新服務器證書的受信根證書。
如未部署,請按指引自行安裝證書,不產生任何費用。
此外,商戶使用的其它https證書不需要更換或者升級。
Q6:如果不驗證,會影響下單/退款等功能嗎?
A:大部分情況下,即使不驗證根證書也不會影響下單、退款等功能。為了避免商戶服務器上沒有對應根證書的情況,建議商戶仍然按照指引進行驗證。
Q7:微信支付更換證書前,開發人員可以提前安裝根CA證書嗎?還是要微信支付更換后,再安裝根CA證書?
A:需要提前安裝。提前安裝根證書不會影響商戶正在使用的功能。
由於SSL/TLS協議有多種實現版本(OpenSSL, NSS, GnuTLS, JSSE, Schannel等),且在不同實現版本和操作系統中管理權威機構根CA證書的策略不一樣,應用程序使用SSL/TLS的方法也存在差異。
為了確保微信支付更換服務證書后,不影響商戶的正常交易。下面提供了兩種方式供商戶提前驗證客戶端是否支持了DigiCert的證書。
如你的驗證結果為無影響,可忽略安裝證書部分的內容。
方式一:調用微信支付沙箱環境的API接口驗證微信支付已經將新的服務器證書部署到了沙箱域名(apitest.mch.weixin.qq.com), 由於服務器證書是支持多域名的,API域名(api.mch.weixin.qq.com)與沙箱域名(apitest.mch.weixin.qq.com)使用的是同一張證書。如果使用沙箱環境的接口能調用成功,通常表明客戶端支持微信支付新的服務器證書。
API接口調用說明:請求Url | https://apitest.mch.weixin.qq.com/sandboxnew/pay/getsignkey |
---|---|
是否需要證書 | 否 |
請求方式 | POST |
請求格式 | XML |
字段名 | 字段 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
商戶號 | mch_id | 是 | 1305638280 | String(32) | 微信支付分配的微信商戶號 |
隨機字符串 | nonce_str | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 隨機字符串,不長於32位 |
簽名 | sign | 是 | 5K8264ILTKCH16CQ2502SI8ZNMTM67VS | String(32) | 簽名結果,詳見簽名生成算法 |
字段名 | 字段 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
返回狀態碼 | return_code | 是 | SUCCESS | String(16) | SUCCESS/FAIL |
返回信息 | return_msg | 否 | 簽名失敗 | String(128) | 返回信息,如非空,為錯誤原因 ,簽名失敗 ,參數格式校驗錯誤 |
以下字段在return_code 為SUCCESS的時有返回。
字段名 | 字段 | 必填 | 示例值 | 類型 | 說明 |
---|---|---|---|---|---|
商戶號 | mch_id | 是 | 1305638280 | String(32) | 微信支付分配的微信商戶號 |
沙箱密鑰 | sandbox_signkey | 否 | 013467007045764 | String(32) | 返回的沙箱密鑰 |
當返回結果return_code為“SUCCESS”,說明當前客服端已支持DigCert證書,反之則需要根據安裝證書部分的指引,升級證書。
注意:驗收完成后,請及時恢復服務器上的host配置,微信支付服務器證書更新完成后,此處使用的IP會被關停。
商戶可以根據不同的網絡運營商, 為域名 api.mch.weixin.qq.com 配置以下HOST:
網絡運營商 |
綁定IP |
端口 |
---|---|---|
電信 |
113.96.240.139 |
443 |
聯通 |
157.255.180.139 |
443 |
其它(移動, 長城等) |
121.51.30.139 |
443 |
HOST環境可以訪問的接口與正式環境完全一致,且真實生效, 商戶驗證前, 務必評估對業務的影響。 如果未配置以上HOST的話, 在2018年5月31日前,訪問api.mch.weixin.qq.com時, 服務器依然返回老的GeoTrust證書。
如果可以正常訪問api.mch.weixin.qq.com域名下的統一下單、查詢訂單等接口,說明客戶端支持了DigCert證書,反之則需要根據安裝證書部分的指引,升級證書。
注意事項:
◆ 建議商戶在使用方式A驗證后, 再使用方式B驗證, 以確保交易不受影響
◆ 建議不要忽略服務器證書校驗的錯誤, 避免受到中間人攻擊
◆ 請確保驗證環境和正式環境一致,需要使用相同的操作系統、開發語言、執行環境、SSL\TLS庫等
如果你的服務器上沒有內置DigiCert的根CA證書, 采用上面兩種方式驗證的過程中, 可能會碰到問題。需要你主動往操作系統或者執行環境的證書信任列表中,添加DigiCert的根證書。
為了提升兼容性, 微信支付的服務器上部署了DigiCert的交叉證書. 客戶端的執行環境中需要安裝(Baltimore CyberTrust Root.crt DigiCert Global Root CA.crt)中的任意一個, 即可。
DigiCert根CA證書兼容性列表如下:
權威機構根CA證書 |
證書序列號 |
證書有效期 |
Windows兼容 |
Java兼容 |
證書下載 |
---|---|---|---|---|---|
DigiCert Global Root CA |
08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a |
2006.11.10 - 2031.11.10 |
Windows 7+ |
1.6.05及以上 |
|
Baltimore CyberTrust Root CA |
02:00:00:b9 |
2000.5.13 - 2025.5.13 |
Windows XP及以上 |
1.4.2及以上 |
下面針對幾種主流的開發語言, 介紹如何安裝新的根證書:
1.JAVAJava使用JSSE包中的信任管理器來校驗遠端服務器的證書是否合法, TrustStore文件中保存了根證書信任列表. JRE 1.4.2及以上版本自帶的TrustStore文件(lib/security/cacerts)中均內置了DigiCert的根證書。
◆ 如果你使用的JRE版本為1.4.2及以上, 且使用默認的TrustStore文件(lib/security/cacerts), 通常不需要做額外配置, 就能支持新的服務器證書。
◆ 如果你使用的JRE版本低於1.4.2 , 或者在系統屬性javax.net.ssl.trustStore中指定了自定義的TrustStore, 那么需要使用JAVA自帶的證書管理工具 Keytool導入DigiCert的根證書(Keytool需要在java安裝目錄下的lib/security/文件夾中執行)。 具體的命令為:
操作系統 |
操作 |
命令行 |
---|---|---|
windows |
查看
|
keytool.exe -list -keystore cacerts -storepass changeit (digicert證書的別名為: digicertglobalrootca 或者 baltimorecybertrustca) |
新增 |
keytool.exe -importcert -keystore cacerts -storepass changeit -noprompt -file ./DigiCert_Global_Root_CA.der -alias " digicertglobalrootca" (證書格式需要為der) |
|
linux |
查看
|
keytool -list -keystore cacerts -storepass changeit (digicert證書的別名為: digicertglobalrootca 或者 baltimorecybertrustca) |
新增 |
keytool -importcert -keystore cacerts -storepass changeit -noprompt -file ./DigiCert_Global_Root_CA.der -alias " digicertglobalrootca (證書格式需要為der) |
使用C++開發的應用程序, 通常使用libcurl庫發起https請求, libcurl支持多種SSL\TLS引擎, 如 OpenSSL, SChanel, NSS等。
更詳細的內容,可參考:https://curl.haxx.se/docs/ssl-compared.html
◆使用OpenSSL時, 參考如下操作:
步驟一: 查看openssl根證書信任文件路徑. 執行命令行 openssl version –a ,輸出結果中的 OPENSSLDIR就是根證書信任文件路徑
$ openssl version -a
OpenSSL 1.0.1e-fips 11 Feb 2013
built on: Tue Mar 24 14:14:19 CST 2015
platform: linux-x86_64
options: bn(64,64) md2(int) rc4(16x,int) des(idx,cisc,16,int) idea(int) blowfish(idx)
compiler: gcc -fPIC -DOPENSSL_PIC -DZLIB -DOPENSSL_THREADS -D_REENTRANT -DDSO_DLFCN -DHAVE_DLFCN_H -DKRB5_MIT -m64 -DL_ENDIAN -DTERMIO -Wall -O2 -g -pipe -Wall -Wp,-D_FORTIFY_SOURCE=2 -fexceptions -fstack-protector --param=ssp-buffer-size=4 -m64 -mtune=generic -Wa,--noexecstack -DPURIFY -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DWHIRLPOOL_ASM -DGHASH_ASM
OPENSSLDIR: "/etc/pki/tls"
engines: rdrand dynamic
步驟二: 按照驗證證書的方式二配置host,然后使用以下命令行, 確認操作系統內置的根證書中, 是否支持DigiCert證書
或者
$ openssl s_client -connect api.mch.weixin.qq.com:443 -verify_return_error
正常的輸出為:
depth=3 C = IE, O = Baltimore, OU = CyberTrust, CN = Baltimore CyberTrust Root
verify return:1
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify return:1
depth=1 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = GeoTrust RSA CA 2018
verify return:1
depth=0 C = CN, L = Shenzhen, O = Tencent Technology (Shenzhen) Company Limited, OU = R&D, CN = payapp.weixin.qq.com
verify return:1
CONNECTED(00000003)
---
Certificate chain
0 s:/C=CN/L=Shenzhen/O=Tencent Technology (Shenzhen) Company Limited/OU=R&D/CN=payapp.weixin.qq.com
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=GeoTrust RSA CA 2018
1 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=GeoTrust RSA CA 2018
i:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
2 s:/C=US/O=DigiCert Inc/OU=www.digicert.com/CN=DigiCert Global Root CA
i:/C=IE/O=Baltimore/OU=CyberTrust/CN=Baltimore CyberTrust Root
缺少DigiCert根證書時, 可能輸出的錯誤信息為:
depth=2 C = US, O = DigiCert Inc, OU = www.digicert.com, CN = DigiCert Global Root CA
verify error:num=20:unable to get local issuer certificate
verify return:0
CONNECTED(00000003)
---
步驟三: 安裝根證書。幾種常見的linux發行版本的操作命令如下:
操作系統 |
操作 |
命令行 |
---|---|---|
Ubuntu, Debian |
查看根證書
|
確認操作系統上,是否存在以下文件:
|
安裝根證書 |
(更多的命令行參數及說明, 請查看: man update-ca-certificates)
|
|
CentOs, Red Hat Enterprise Linux |
查看根證書
|
確認/etc/pki/tls/certs/ca-bundle.crt文件中, 是否存在以下內容:
Serial Number: 08:3b:e0:56:90:42:46:b1:a1:75:6a:c9:59:91:c7:4a
Serial Number: 0x20000b9 |
安裝根證書 |
(更多的命令行參數及說明, 請查看: man update-ca-trust) |
◆ 使用Schannel時, 參考如下操作:
Windows系統上的libcurl使用的TLS引擎是Schannel, 根證書的導入可以參考C#章節。
3.C#在windows服務器上的C#開發語言或者, 通常使系統自帶Schannel(別名: Secure Channel 或者 WinSSL)發起HTTPS請求, 權威機構的根證書由Windows操作系統集中管理。
可通過以下步驟來確認操作系統中是否內置了根證書 :
步驟一: 打開mmc(在搜索程序中輸入mmc,然后回車)進入如下界面:
步驟二: 在”文件”中選擇 “添加/刪除管理單元”:
步驟三: 在“添加/刪除管理單元”中選擇”證書”, 雙擊后選擇 “計算機賬戶”和”本地計算機”:
選擇證書, 點擊添加:
步驟四: 點擊完成后, 可以看到如下界面. 右鍵單擊”受信任的根證書頒發機構”:
步驟五: 選中查找證書, 搜索”證書序列號”為“08 3b e0 56 90 42 46 b1 a1 75 6a c9 59 91 c7 4a” 或者” 02 00 00 b9” 如果有結果輸出, 則表明操作系統中已經內置了DigiCert的根CA證書
如果操作系統中, 沒有內置DigiCert根CA證書的話. 可以通過以下步驟安裝:
步驟一:雙擊根證書文件,“安裝證書”:
步驟二:在彈出證書導入向導中,如右圖所示, 點擊下一步:
步驟三:在“選擇證書存儲”對話框中選擇“受信任的根證書頒發機構”,點擊確定
步驟四:點擊“完成”,系統提示”導入成功”。導入成功后, 可以按照前面介紹方法確認系統中DigiCert根證書
1. 請檢查你的代碼(特別是退款、企業紅包及企業付款等需要雙向認證的接口)中是否指定了crypto/tls包中的 RootCAs 配置項。 (可參考: https://golang.org/pkg/crypto/tls/ )
2. 如果沒有指定根證書文件,請按指引中提供的驗證方式,確認是否支持微信支付新的服務器證書
3. 如果指定了根證書文件, 請務必刪除相關代碼,然后驗證現有功能是否正常, 再驗證是否支持微信支付新的服務器證書。
備注: GO語言中校驗服務器證書的規則為:
a) 缺省情況下, 用系統自帶的根證書。
b) 如果商戶指定了根ca的話, 就用商戶指定的。
c) 當商戶指定的根CA證書與服務器證書不匹配時,接口調用會失敗, 錯誤提示為 "x509: certificate signed by unknown authority"
其他請參考對應的TLS/SSL庫相關手冊。