对接微信支付V3的接口,可以算是从1开始踩坑,多的不说,先记录一下这个平台证书的问题。
在拿到这个AEAD_AES_256_GCM加密后的证书内容,需要去做解密,这个时候很尴尬的,微信这边仅仅提供了php和java版本的。
而我是.NET CORE3.1版本的
找了半天资料,很容易发现有一个类可以实现AESGCM的加解密:AesGcm
Decrypt(byte[] nonce, byte[] ciphertext, byte[] tag, byte[] plaintext, byte[] associatedData = null)
可以看到需要提供这么几个参数
其中关于tag,微信文档也没用明确提出应该怎么去获取,最终找遍了全网都没发现有文章说怎么获取。
于是乎只有参考一下微信提供的php示例以及java示例
看了java示例没有发现有tag的存在,最终在php示例里边找到了tag的获取方式
tag的获取方式:
在进行base64解码后,证书密文是证书密文长度-16,tag=证书密文最后16个字节
var gcm = new AesGcm(Encoding.UTF8.GetBytes("APIV3密钥"));
byte[] cipherTextBytes = Convert.FromBase64String("平台证书ciphertext字段");
byte[] nonce = Encoding.UTF8.GetBytes("平台证书nonce字段");
byte[] ciphertext = cipherTextBytes.Take(cipherTextBytes.Length - 16).ToArray();
byte[] plaintext = new byte[ciphertext.Length];
byte[] tag = cipherTextBytes.Skip(ciphertext.Length).Take(16).ToArray();
byte[] associatedData = Encoding.UTF8.GetBytes("平台证书associated_data字段");
gcm.Decrypt(nonce, ciphertext, tag, plaintext, associatedData);
string text = Encoding.UTF8.GetString(plaintext);
为啥我折报错了。。。。
System.Security.Cryptography.CryptographicException:“The computed authentication tag did not match the input authentication tag.”
var gcm = new AesGcm(Encoding.UTF8.GetBytes(key));
byte[] cipherTextBytes = Convert.FromBase64String(_ciphertext);
byte[] nonce = Encoding.UTF8.GetBytes(_nonce);
byte[] ciphertext = cipherTextBytes.Take(cipherTextBytes.Length - 16).ToArray();
byte[] plaintext = new byte[ciphertext.Length];
byte[] tag = cipherTextBytes.Skip(ciphertext.Length).Take(16).ToArray();
byte[] associatedData = Encoding.UTF8.GetBytes(_associated_data);
gcm.Decrypt(nonce, ciphertext, tag, plaintext, associatedData);
string text = Encoding.UTF8.GetString(plaintext);
感谢大佬啊,终于找到解决方案了,如果是使用mac的小伙伴,还需要注意 openssl的问题。具体参考如下:
Resolving missing link to libcrypto openssl on OSX from: http://stackoverflow.com/questions/38670295/brew-refusing-to-link-openssl
brew update
brew install openssl
ln -s /usr/local/opt/openssl/lib/libcrypto.1.0.0.dylib /usr/local/lib/
ln -s /usr/local/opt/openssl/lib/libssl.1.0.0.dylib /usr/local/lib/
参考链接:
https://blog.bokan.io/posts/aesccm-and-aesgcm-in-dotnet-core-on-macos-catalina/
https://gist.github.com/aklap/e885721ef15c8668ed0a1dd64d2ea1a7