jakarta-ee - 不接受您的登录证书,或者可能没有提供
问题描述
我正在尝试将数据发布到银行网站。我做了什么:
- 我已经在 glassfish 中安装了颁发给另一个域的证书并在 localhost 中使用它。
- 将证书导入到信任库
然后在将表格(POST)提交到银行网站时,我得到了
didn’t accept your login certificate, or one may not have been provided.
ERR_BAD_SSL_CLIENT_AUTH_CERT
我还尝试从代码中加载 .jks 文件并打开 sslSocket,然后使用 httpsUrlConnection 发布数据。此方法可独立工作,但在使用 glassfish 中部署的 throug 应用程序时,它会提供
didn’t accept your login certificate, or one may not have been provided.
ERR_BAD_SSL_CLIENT_AUTH_CERT
我做过的代码:
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(new FileInputStream("E://keystore.jks"), "asdf".toCharArray());
Enumeration<String> en = ks.aliases();
int n = 0;
PrivateKey privKey = null;
Certificate certificate = null;
Certificate[] certificates = null;
String alias = "";
while (en.hasMoreElements()) {
String aliasKey = en.nextElement();
System.out.println("aliaskey " + aliasKey);
alias = aliasKey;
privKey = (PrivateKey) ks.getKey(aliasKey, "smart@123".toCharArray());
System.out.println("privKey " + privKey);
certificate = ks.getCertificate(aliasKey);
System.out.println("certificate " + certificate);
certificates = ks.getCertificateChain(aliasKey);
System.out.println("certificates " + certificates);
System.out.println("Provider " + ks.getProvider().getName());
try {
KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
kmf.init(ks, "asdf".toCharArray());
SSLContext sc = SSLContext.getInstance("TLS");
sc.init(kmf.getKeyManagers(), null, null);
SSLContext sslContext = null;
sslContext = SSLContext.getInstance("TLS");
sslContext.init(kmf.getKeyManagers(), null, null);
String url = "https://example.com/form";
URL urlObj = new URL(url);
HttpsURLConnection conn = (HttpsURLConnection) urlObj.openConnection();
if (conn instanceof HttpsURLConnection) {
((HttpsURLConnection) conn).setSSLSocketFactory(sslContext.getSocketFactory());
}
conn.setReadTimeout(10000);
conn.setConnectTimeout(15000);
conn.setRequestMethod("POST");
conn.setRequestProperty("Content-Type", "application/xml");
conn.setRequestProperty("User-Agent", "Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)");
conn.setDoInput(true);
conn.setDoOutput(true);
String payload = "datas";
OutputStream output = new BufferedOutputStream(conn.getOutputStream());
output.write(payload.getBytes());
output.flush();
}
解决方案
推荐阅读
- javascript - 使用jquery将父项克隆到子列表中
- sqlite - 如何从 xamarin.forms 的集合视图中删除项目?
- mysql - 我想将两个表及其列选择为单个结果
- python - 通过输入在 2d 列表中导航路径
- java - 预检响应中的 Access-Control-Allow-Headers 不允许请求标头字段 x-xsrf-token
- python-3.x - 使用 fb 应用授予的所有权限获取 facebook 页面访问令牌
- url - GatsbyJS - URL 中的哈希后正斜杠或数字崩溃应用程序
- javascript - Safari 中的 SVG 路径动画故障
- c# - 如何在 Visual Studio Outlook 加载项中触发事件
- c++ - 如何使用 istringstream 读取和解析文本文件?