Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
“我该如何解决?”;证书验证失败的自签名证书“;当尝试连接到API时?_Api_Ssl_Openssl_Tls1.2 - Fatal编程技术网

“我该如何解决?”;证书验证失败的自签名证书“;当尝试连接到API时?

“我该如何解决?”;证书验证失败的自签名证书“;当尝试连接到API时?,api,ssl,openssl,tls1.2,Api,Ssl,Openssl,Tls1.2,在我的开发环境中,我构建的代码将与只接受TLS 1.2(Authorize.net Ruby SDK)的API连接 是: 我在那里没有看到自签名证书?还是我走错了路 代码很简单,如果你愿意,你可以在家里测试自己 include AuthorizeNet::API trx = AuthorizeNet::API::Transaction.new('8Gxa...', '6LKh9...', gateway: :sandbox) request = CreateCustomerProfileRequ

在我的开发环境中,我构建的代码将与只接受TLS 1.2(Authorize.net Ruby SDK)的API连接

是:

我在那里没有看到自签名证书?还是我走错了路

代码很简单,如果你愿意,你可以在家里测试自己

include AuthorizeNet::API
trx = AuthorizeNet::API::Transaction.new('8Gxa...', '6LKh9...', gateway: :sandbox)
request = CreateCustomerProfileRequest.new
request.profile = CustomerProfileType.new
request.profile.merchantCustomerId = 'abc'
request.profile.description = 'name'
response = trx.create_customer_profile(request)
所以我需要两件事:

  • 了解这是否是我的设置/环境的问题,以及如何解决它
  • 或者,了解这是否是API方面的问题(Authorize.net),以及如何补偿它,或者告诉他们实际发生了什么

apitest.authorize.net
具有通配符证书

 2 s:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
   i:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
openssl-1.1.1h中的文件
x509v3.h

/* Disable wildcard matching for dnsName fields and common name. */
# define X509_CHECK_FLAG_NO_WILDCARDS    0x2
这表明默认情况下禁用了通配符匹配

v3\u utl.c

if (flags & X509_CHECK_FLAG_NO_WILDCARDS)
        equal = equal_nocase;
    else
        equal = equal_wildcard;

这意味着Openssl将使用不区分大小写的比较,在这种情况下,
apitest.authorize.net
将不匹配
*。authorize.net

您是否与开发人员仔细检查了libressl在其设置中加载了哪些CA证书

链中自签名错误意味着验证操作能够构建信任链,但无法在该链中找到证书颁发机构

由于证书链检查和验证在其他地方确实有效,因此我将首先验证他的设置

更准确地说,如果我们看一下链条:

$openssl s_客户端-showcerts-connect-apitest.authorize.net:443
已连接(00000003)
深度=2 C=美国,O=“委托,股份有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2009委托,股份有限公司-仅供授权使用”,CN=委托根认证机构-G2
验证返回:1
深度=1 C=美国,O=“委托,有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2012委托,有限公司-仅供授权使用”,CN=委托认证机构-L1K
验证返回:1
深度=0 C=US,ST=California,L=Foster City,O=Authorize.Net,CN=*.Authorize.Net
验证返回:1
---
证书链
0 s:C=US,ST=California,L=Foster City,O=Authorize.Net,CN=*.Authorize.Net
i:C=US,O=“委托,有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2012委托,有限公司-仅供授权使用”,CN=委托认证机构-L1K
-----开始证书-----
...
-----结束证书-----
1 s:C=US,O=“委托,股份有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2012委托,股份有限公司-仅供授权使用”,CN=委托认证机构-L1K
i:C=US,O=“委托,有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2009委托,有限公司-仅供授权使用”,CN=委托根认证机构-G2
-----开始证书-----
...
-----结束证书-----
2 s:C=US,O=“委托,股份有限公司”,OU=请参见www.trust.net/legal-terms,OU=“(C)2009委托,股份有限公司-仅供授权使用”,CN=委托根认证机构-G2
i:C=US,O=“委托,有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2009委托,有限公司-仅供授权使用”,CN=委托根认证机构-G2
-----开始证书-----
...
-----结束证书-----
---
服务器证书
subject=C=US,ST=California,L=Foster City,O=Authorize.Net,CN=*.Authorize.Net
发卡机构=C=美国,O=“委托,有限公司”,OU=见www.econtrust.net/legal-terms,OU=“(C)2012委托,有限公司-仅供授权使用”,CN=委托认证机构-L1K
---
未发送客户端证书CA名称
---
SSL握手读取4298字节,写入641字节
验证:好的
---
这告诉我们该链使用G2根证书和L1k证书

 2 s:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
   i:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
此CA证书可从下载(以进行双重检查)


我建议与开发人员确认此证书在其设置中是否正确可信。

Ug事实证明,这实际上是authorize.net沙盒所期望的。我需要传递一个
verify\u ssl
标志并将其设置为false。

我猜您的服务器不必发送委托的根证书,该证书必须是自签名证书

 2 s:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
   i:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2

我不知道你在问什么。它是您的代码检索到的证书。这到底是什么证书取决于代码中访问的URL,即它通常是最终服务器提供的证书。如果TLS拦截是在路径中的某个位置进行的,可能是另一个证书,例如使用公司防火墙,但也使用一些本地防病毒产品。我想问的是为什么会发生这种情况以及如何修复它。我想使用此服务,但我不知道为什么本地(以及我们的生产服务器上)发生此错误,而不是我同事的开发环境。不,默认情况下清除“检查”标志,因此启用通配符,除非ruby(或应用程序)有意禁用它们,我对此表示怀疑——而且几乎可以肯定,在运行相同代码的两个系统上不会有什么不同。此外,如果这是一个问题,它会产生一个完全不同的验证错误,加上名称检查是在链验证之后进行的,并且只有在验证成功的情况下才进行。或者更确切地说,是ruby和/或应用程序代码告诉他们的libre加载的,因为和Open/LibreSSL支持应用程序指定或默认位置,但是,既不提供应用程序,也不提供其他程序包或用户必须执行的内容。使用这意味着任何人都可以使用中间人攻击系统,那么为什么首先使用SSL?它是沙箱。我猜他们不认为这很重要。在锡拉和卡里巴斯之间。。。
 2 s:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2
   i:C = US, O = "Entrust, Inc.", OU = See www.entrust.net/legal-terms, OU = "(c) 2009 Entrust, Inc. - for authorized use only", CN = Entrust Root Certification Authority - G2