Powerbuilder 9.0.3 和 Powerbuilder 12.6 的 Chilkat RSASSA-PSS 签名问题
Chilkat RSASSA-PSS signature problem with Powerbuilder 9.0.3 and Powerbuilder 12.6
我们在 Powerbuilder 9.0.3 应用程序(以及 powerbuilder 12.6)中使用 Chilkat 对 HTTP 请求进行签名,但好像 Chilkat 生成的签名不被 Isabel 的 API 接受(我们已经联系过伊莎贝尔和他们猜测签名算法中存在参数问题)。
Isabel API (https://documentation.ibanity.com/http-signature) 的文档说我们必须使用具有以下参数的 RSASSA-PSS 签名算法。
- 哈希算法:SHA-256
- 掩码生成函数:MGF1 Mask
- 生成算法:SHA-256
- salt 长度:32 字节(= 256 位,与散列长度相同)
- 预告片字段:1
因此我们设置了 chilkat Rsa 组件,如下所示:
loo_Rsa = create oleobject
li_rc = loo_Rsa.ConnectToNewObject("Chilkat_9_5_0.Rsa")
loo_Rsa.DebugLogFilePath = "c:\tmp\rsa.log"
loo_Rsa.VerboseLogging=1
li_Success=loo_Rsa.ImportPrivateKeyObj(loo_Privkey)
if li_Success <> 1 then
ls_error = "Error importPrivateKey: "+loo_Rsa.LastErrorText
destroy loo_Rsa
goto ee_error
end if
// Use RSA-PSS by setting OaepPadding = 1
loo_Rsa.OaepPadding = 1
loo_Rsa.OaepHash = "SHA-256"
loo_Rsa.EncodingMode = "base64"
ls_Signature = loo_Rsa.SignStringENC(ls_signing_string,"SHA-256")
根据 Isabel 文档,您认为我们在 Chilkat 中正确设置了 RSA 参数还是遗漏了什么? (我们也尝试过 LittleEndian = 0 但我们从 Isabel API 收到了同样的错误)。
供您参考的是 chilkat 的日志:
在日志中我看到 Chilkat 有时在签名字符串中的字符“=”之后添加字符 3D,是否正常? (在下面的日志中,我将字符 3D 加粗)
ImportPrivateKeyObj:
Dll日期:2018年2月12日
奇尔卡特版本:9.5.0.72
解锁前缀:BEWANB.CB1042019
架构:Little Endian; 32位
语言:ActiveX
详细记录:1
toPrivKeyXml:
toRsaPrivateKeyXml:
toRsaPkcs1PrivateKeyDer:
(离开上下文)
解码到 Asn:
(离开上下文)
(离开上下文)
(离开上下文)
导入私钥:
加载任何字符串:
加载AnyXml:
加载AnyXml:
(离开上下文)
(离开上下文)
(离开上下文)
(离开上下文)
成功。
(离开上下文 15 毫秒)
SignStringENC:
Dll日期:2018年2月12日
奇尔卡特版本:9.5.0.72
解锁前缀:BEWANB.CB1042019
架构:Little Endian; 32位
语言:ActiveX
详细记录:1
哈希算法:SHA-256
字符集:windows-1252
使用购买的解锁代码成功解锁组件。
inputBytesQP: (request-target): get /isabel-connect/account-reports?offset=3D0&size=3D100=
\n主机:api.ibanity.com\ndigest:SHA-512=3Dz4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXc=
g/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=3D=3D\n(创建):16=
15285438\nauthorization: 承载 access_token_1615285439
哈希和签名:
modulus_bitlen: 2048
哈希字节:070D CF6B 85D6 ACE2 971F 20B3 29A0 439A
FE36 9394 0D1C 10E7 513B 1447 F04D 39B2
padAndSignHash:
密钥类型:私有
hashInSize: 32
填充:PSS
哈希算法:SHA-256
pss_encode:
长度:256
autoSelectedSaltLen:32
(离开上下文)
(离开上下文 31 毫秒)
字节顺序:小端
(离开上下文 47 毫秒)
signature: Te3sMFkvo26Mi5pkLsB8AwAJYynlB3xKU1Dy2AyPS4GlF1fUgTU4k5dU3mSu2dkJEbvmkUd+aPuwo+51AyNarcD7vGtFp/ze3vjCB87lZ+qrzDquEpVUNOb6tOq467odIeGPAsj4b9sa6JsdXciEGKPIZgC8+7zojm87f2MdAVVkDXTwFq7nmI+Q5czGlswLpihYn4VF+5ateKDInl1TdiekujmBh5ffkZAE43LZQX4UWIhqqlak7p2P9GyhF9n3RQRZ55Tp25vOWgPdnwz90OKnQR5aWtcHoVY+JuIl0VX49UFELU+L/Xz9tOGnilA7UcKElWMXVzcEqo3KLcGUWQ==
成功。
(离开上下文 47 毫秒)
导入私钥对象:
Dll日期:2018年2月12日
奇尔卡特版本:9.5.0.72
解锁前缀:BEWANB.CB1042019
架构:Little Endian; 32位
语言:ActiveX
详细记录:1
toPrivKeyXml:
toRsaPrivateKeyXml:
toRsaPkcs1PrivateKeyDer:
(离开上下文)
解码到 Asn:
(离开上下文)
(离开上下文)
(离开上下文)
导入私钥:
加载任何字符串:
加载AnyXml:
加载AnyXml:
(离开上下文)
(离开上下文)
(离开上下文)
(离开上下文)
成功。
(离开上下文 31 毫秒)
SignStringENC:
Dll日期:2018年2月12日
奇尔卡特版本:9.5.0.72
解锁前缀:BEWANB.CB1042019
架构:Little Endian; 32位
语言:ActiveX
详细记录:1
哈希算法:SHA-256
字符集:windows-1252
使用购买的解锁代码成功解锁组件。
inputBytesQP: (request-target): get /isabel-connect/account-reports?offset=3D0&size=3D100=
\n主机:api.ibanity.com\ndigest:SHA-512=3Dz4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXc=
g/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=3D=3D\n(创建):16=
15287272\nauthorization: 承载 access_token_1615287272
哈希和签名:
modulus_bitlen: 2048
哈希字节:B22B C9AF 7041 43E4 1CFE 5898 C88C C9CE
95FC B536 AC75 1F21 996C 7E7A 7B19 80EF
padAndSignHash:
密钥类型:私有
hashInSize: 32
填充:PSS
哈希算法:SHA-256
pss_encode:
长度:256
autoSelectedSaltLen:32
(离开上下文)
(离开上下文 31 毫秒)
字节顺序:小端
(离开上下文 31 毫秒)
signature: 0b/fLp4xbSaGqrH7HXsP8bRuhtr9xo7oPiY1+ryhVuR4vDCdCRFc2As6RX2SazS2T2MK4P966TX1rr5Qx2VnDYN0JL6ZnZAiR/P+ILP19bJN9+f6Jv1nfmgSOUB/stxeLKNlibeMXaR6+heX/ccGY807r8MdEk3hGFwlkK611GjrHoNTH+vge2ReQo8lKBaVP1QIHCvwXUVS39GdABHFLxTQ8La514YX8qruJp6i69lDfCvh4P9rOl5pebMwknyEjJ2rs0D40MUU8z+hM5bm+hSD100S7Ww9sDwObitn4FftR60fee/f3vf9qCv0wkBTBbVP8DTR4vbpKxv/oUNXFQ==
成功。
(leaveContext 31ms)
我们从 Isabel API:
收到了这个错误
{"errors":[{"code":"invalidSignature","detail":"无法验证HTTP签名,请参考https://documentation.ibanity.com/http-signature","元":{}}]}
这里也是原始签名字符串:
(请求目标): get /isabel-connect/account-reports?offset=0&size=100\nhost: api.ibanity.com\ndigest: SHA-512=z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP +DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==\n(已创建):1615287272\nauthorization:承载 access_token_1615287272
提前感谢您的帮助或建议。
此致。
家伙
我创建了一些示例,并将在此处创建更多示例:https://www.example-code.com/powerbuilder/ibanity.asp
它现在工作正常,事实上,基于 Chlikat 示例,我更改了构建签名字符串的方式:我使用字符串变量代替 Chilkat StringBuilder
代替这个
// Step 4 - Build the signing string
ls_signing_string = "(request-target): "+ls_request_target+'\n'+&
"host: api.ibanity.com\n"+&
"digest: "+ls_digest+"\n"+&
"(created): "+ls_created+"\n"+&
"authorization: "+"Bearer "+is_token_isabel
...
ls_Signature = loo_Rsa.SignStringENC(ls_signing_string,"SHA-256")
我应该用这个
// Step 4 - Build the signing string
oleobject loo_SbSigningString
loo_SbSigningString = create oleobject
li_rc = loo_SbSigningString.ConnectToNewObject("Chilkat_9_5_0.StringBuilder")
loo_SbSigningString.Append("(request-target): ")
loo_SbSigningString.AppendLine(ls_Request_target,0)
loo_SbSigningString.Append("host: ")
loo_SbSigningString.AppendLine("api.ibanity.com",0)
loo_SbSigningString.Append("digest: ")
loo_SbSigningString.AppendLine(ls_digest,0)
loo_SbSigningString.Append("(created): ")
loo_SbSigningString.AppendLine(ls_Created,0)
loo_SbSigningString.Append("authorization: Bearer "+is_token_isabel)
..
ls_Signature = loo_Rsa.SignStringENC(loo_SbSigningString.GetAsString(),"sha-256")
我们在 Powerbuilder 9.0.3 应用程序(以及 powerbuilder 12.6)中使用 Chilkat 对 HTTP 请求进行签名,但好像 Chilkat 生成的签名不被 Isabel 的 API 接受(我们已经联系过伊莎贝尔和他们猜测签名算法中存在参数问题)。 Isabel API (https://documentation.ibanity.com/http-signature) 的文档说我们必须使用具有以下参数的 RSASSA-PSS 签名算法。
- 哈希算法:SHA-256
- 掩码生成函数:MGF1 Mask
- 生成算法:SHA-256
- salt 长度:32 字节(= 256 位,与散列长度相同)
- 预告片字段:1
因此我们设置了 chilkat Rsa 组件,如下所示:
loo_Rsa = create oleobject
li_rc = loo_Rsa.ConnectToNewObject("Chilkat_9_5_0.Rsa")
loo_Rsa.DebugLogFilePath = "c:\tmp\rsa.log"
loo_Rsa.VerboseLogging=1
li_Success=loo_Rsa.ImportPrivateKeyObj(loo_Privkey)
if li_Success <> 1 then
ls_error = "Error importPrivateKey: "+loo_Rsa.LastErrorText
destroy loo_Rsa
goto ee_error
end if
// Use RSA-PSS by setting OaepPadding = 1
loo_Rsa.OaepPadding = 1
loo_Rsa.OaepHash = "SHA-256"
loo_Rsa.EncodingMode = "base64"
ls_Signature = loo_Rsa.SignStringENC(ls_signing_string,"SHA-256")
根据 Isabel 文档,您认为我们在 Chilkat 中正确设置了 RSA 参数还是遗漏了什么? (我们也尝试过 LittleEndian = 0 但我们从 Isabel API 收到了同样的错误)。
供您参考的是 chilkat 的日志:
在日志中我看到 Chilkat 有时在签名字符串中的字符“=”之后添加字符 3D,是否正常? (在下面的日志中,我将字符 3D 加粗)
ImportPrivateKeyObj: Dll日期:2018年2月12日 奇尔卡特版本:9.5.0.72 解锁前缀:BEWANB.CB1042019 架构:Little Endian; 32位 语言:ActiveX 详细记录:1 toPrivKeyXml: toRsaPrivateKeyXml: toRsaPkcs1PrivateKeyDer: (离开上下文) 解码到 Asn: (离开上下文) (离开上下文) (离开上下文) 导入私钥: 加载任何字符串: 加载AnyXml: 加载AnyXml: (离开上下文) (离开上下文) (离开上下文) (离开上下文) 成功。 (离开上下文 15 毫秒) SignStringENC: Dll日期:2018年2月12日 奇尔卡特版本:9.5.0.72 解锁前缀:BEWANB.CB1042019 架构:Little Endian; 32位 语言:ActiveX 详细记录:1 哈希算法:SHA-256 字符集:windows-1252 使用购买的解锁代码成功解锁组件。 inputBytesQP: (request-target): get /isabel-connect/account-reports?offset=3D0&size=3D100=
\n主机:api.ibanity.com\ndigest:SHA-512=3Dz4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXc=
g/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=3D=3D\n(创建):16=
15285438\nauthorization: 承载 access_token_1615285439 哈希和签名: modulus_bitlen: 2048 哈希字节:070D CF6B 85D6 ACE2 971F 20B3 29A0 439A FE36 9394 0D1C 10E7 513B 1447 F04D 39B2 padAndSignHash: 密钥类型:私有 hashInSize: 32 填充:PSS 哈希算法:SHA-256 pss_encode: 长度:256 autoSelectedSaltLen:32 (离开上下文) (离开上下文 31 毫秒) 字节顺序:小端 (离开上下文 47 毫秒) signature: Te3sMFkvo26Mi5pkLsB8AwAJYynlB3xKU1Dy2AyPS4GlF1fUgTU4k5dU3mSu2dkJEbvmkUd+aPuwo+51AyNarcD7vGtFp/ze3vjCB87lZ+qrzDquEpVUNOb6tOq467odIeGPAsj4b9sa6JsdXciEGKPIZgC8+7zojm87f2MdAVVkDXTwFq7nmI+Q5czGlswLpihYn4VF+5ateKDInl1TdiekujmBh5ffkZAE43LZQX4UWIhqqlak7p2P9GyhF9n3RQRZ55Tp25vOWgPdnwz90OKnQR5aWtcHoVY+JuIl0VX49UFELU+L/Xz9tOGnilA7UcKElWMXVzcEqo3KLcGUWQ== 成功。 (离开上下文 47 毫秒) 导入私钥对象: Dll日期:2018年2月12日 奇尔卡特版本:9.5.0.72 解锁前缀:BEWANB.CB1042019 架构:Little Endian; 32位 语言:ActiveX 详细记录:1 toPrivKeyXml: toRsaPrivateKeyXml: toRsaPkcs1PrivateKeyDer: (离开上下文) 解码到 Asn: (离开上下文) (离开上下文) (离开上下文) 导入私钥: 加载任何字符串: 加载AnyXml: 加载AnyXml: (离开上下文) (离开上下文) (离开上下文) (离开上下文) 成功。 (离开上下文 31 毫秒) SignStringENC: Dll日期:2018年2月12日 奇尔卡特版本:9.5.0.72 解锁前缀:BEWANB.CB1042019 架构:Little Endian; 32位 语言:ActiveX 详细记录:1 哈希算法:SHA-256 字符集:windows-1252 使用购买的解锁代码成功解锁组件。 inputBytesQP: (request-target): get /isabel-connect/account-reports?offset=3D0&size=3D100=
\n主机:api.ibanity.com\ndigest:SHA-512=3Dz4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXc=
g/SpIdNs6c5H0NE8XYXysP+DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg=3D=3D\n(创建):16=
15287272\nauthorization: 承载 access_token_1615287272 哈希和签名: modulus_bitlen: 2048 哈希字节:B22B C9AF 7041 43E4 1CFE 5898 C88C C9CE 95FC B536 AC75 1F21 996C 7E7A 7B19 80EF padAndSignHash: 密钥类型:私有 hashInSize: 32 填充:PSS 哈希算法:SHA-256 pss_encode: 长度:256 autoSelectedSaltLen:32 (离开上下文) (离开上下文 31 毫秒) 字节顺序:小端 (离开上下文 31 毫秒) signature: 0b/fLp4xbSaGqrH7HXsP8bRuhtr9xo7oPiY1+ryhVuR4vDCdCRFc2As6RX2SazS2T2MK4P966TX1rr5Qx2VnDYN0JL6ZnZAiR/P+ILP19bJN9+f6Jv1nfmgSOUB/stxeLKNlibeMXaR6+heX/ccGY807r8MdEk3hGFwlkK611GjrHoNTH+vge2ReQo8lKBaVP1QIHCvwXUVS39GdABHFLxTQ8La514YX8qruJp6i69lDfCvh4P9rOl5pebMwknyEjJ2rs0D40MUU8z+hM5bm+hSD100S7Ww9sDwObitn4FftR60fee/f3vf9qCv0wkBTBbVP8DTR4vbpKxv/oUNXFQ== 成功。 (leaveContext 31ms)
我们从 Isabel API:
收到了这个错误{"errors":[{"code":"invalidSignature","detail":"无法验证HTTP签名,请参考https://documentation.ibanity.com/http-signature","元":{}}]}
这里也是原始签名字符串:
(请求目标): get /isabel-connect/account-reports?offset=0&size=100\nhost: api.ibanity.com\ndigest: SHA-512=z4PhNX7vuL3xVChQ1m2AB9Yg5AULVxXcg/SpIdNs6c5H0NE8XYXysP +DGNKHfuwvY7kxvUdBeoGlODJ6+SfaPg==\n(已创建):1615287272\nauthorization:承载 access_token_1615287272
提前感谢您的帮助或建议。
此致。
家伙
我创建了一些示例,并将在此处创建更多示例:https://www.example-code.com/powerbuilder/ibanity.asp
它现在工作正常,事实上,基于 Chlikat 示例,我更改了构建签名字符串的方式:我使用字符串变量代替 Chilkat StringBuilder 代替这个
// Step 4 - Build the signing string
ls_signing_string = "(request-target): "+ls_request_target+'\n'+&
"host: api.ibanity.com\n"+&
"digest: "+ls_digest+"\n"+&
"(created): "+ls_created+"\n"+&
"authorization: "+"Bearer "+is_token_isabel
...
ls_Signature = loo_Rsa.SignStringENC(ls_signing_string,"SHA-256")
我应该用这个
// Step 4 - Build the signing string
oleobject loo_SbSigningString
loo_SbSigningString = create oleobject
li_rc = loo_SbSigningString.ConnectToNewObject("Chilkat_9_5_0.StringBuilder")
loo_SbSigningString.Append("(request-target): ")
loo_SbSigningString.AppendLine(ls_Request_target,0)
loo_SbSigningString.Append("host: ")
loo_SbSigningString.AppendLine("api.ibanity.com",0)
loo_SbSigningString.Append("digest: ")
loo_SbSigningString.AppendLine(ls_digest,0)
loo_SbSigningString.Append("(created): ")
loo_SbSigningString.AppendLine(ls_Created,0)
loo_SbSigningString.Append("authorization: Bearer "+is_token_isabel)
..
ls_Signature = loo_Rsa.SignStringENC(loo_SbSigningString.GetAsString(),"sha-256")