java - TaxCore - 使用智能卡证书请求 token

标签 java ssl certificate httprequest

我正在尝试制作的应用程序需要通过向 TaxCore 服务器提供从智能卡获取的个人证书来请求 token 。
我已经从智能卡中导出了证书,并将其命名为 buisness.cer。
我还需要另外 2 个证书来建立 https 连接(Sandbox SUF Issuing CA 1.cerSandbox SUF RCA.cer)。
官方文档说明了以下步骤:

  • 创建 HTTPS GET 请求对象
  • 添加 HTTP 头“Accept: application/json”和“Content-Type: application/json”
  • 从 PKI 小程序读取证书
  • 使用 PKI 小程序中的证书建立 SSL/TLS 连接
  • 向 TaxCore.API Web 服务上的“/api/v3/sdc/token”操作发送请求。
  • 将响应读取为下面定义的 JSON 结构

  • 我已经浪费了好几天的时间来尝试完成这项工作,并测试了我在互联网上可以找到的所有示例,但尽管我付出了努力,我最终还是得到了 401 响应。{"Message":"Authorization has been denied for this request."}目前我有这个(非工作):
    private static X509Certificate getCert(String f) {
        InputStream is0;
        try {
            CertificateFactory cf0 = CertificateFactory.getInstance("X.509");
            is0 = new FileInputStream(f);
            var cer = (X509Certificate) cf0.generateCertificate(is0);
            is0.close();
            return cer;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }
    public final static void main(String[] args) throws Exception {
            var buisnessCert = getCert("someplace/buisness.cer");
            var issuingCaCert = getCert("someplace/issuingCa.cer");
            var rcaCert = getCert("someplace/rca.cer");
            var tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());
            ks.load(null);
            ks.setCertificateEntry("issuingCaCert", issuingCaCert);
            ks.setCertificateEntry("rcaCert", rcaCert);
            ks.setCertificateEntry("buisnessCert", buisnessCert);
            tmf.init(ks);
            SSLContext sslContext = SSLContext.getInstance("TLS");
            sslContext.init(null, tmf.getTrustManagers(), null);
            SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslContext, null, null,
                SSLConnectionSocketFactory.getDefaultHostnameVerifier());
            CloseableHttpClient httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
            try {
                HttpGet httpget = new HttpGet("https://taxcoreservergoeshere/api/v3/sdc/token");
                httpget.setHeader("Accept", "application/json");
                httpget.setHeader("Content-Type", "application/json");
                CloseableHttpResponse response = httpclient.execute(httpget);
                try {
                    HttpEntity entity = response.getEntity();
                    System.out.println(EntityUtils.toString(entity));
                    EntityUtils.consume(entity);
                } finally {
                    response.close();
                }
            } finally {
                httpclient.close();
            }
        }
    
    非常感谢任何帮助。

    最佳答案

    证书不应该离开智能卡。您需要使用 PKCS#11 提供程序来实例化您的 keystore 。这个答案可能是一个很好的起点:
    Java Access Token PKCS11 Not found Provider

    关于java - TaxCore - 使用智能卡证书请求 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70700788/

    相关文章:

    java - Hibernate:在子类中添加列

    java - 如何验证 Android 项目使用 Java 库(JAR 文件)是否有效?

    java - 如何获取网站的根CA?

    SSL 证书从一台服务器迁移到另一台服务器

    java - Spring Cloud 配置服务器无法解析占位符

    java - 如何使用 spring 集成通过 http header 动态传递值

    Java HTTPS 客户端在 curl 成功时未能通过 SSL 握手

    Java 7 : SEND TLSv1. 2 ALERT : fatal, 描述 = handshake_failure 骡子

    python 创建签名 X509

    java - 无法通过 bouncycaSTLe 库在 Android 上生成证书请求