当前位置: 首页 > 知识库问答 >
问题:

如何将Curl SSL请求转换为Java代码

南宫鸿晖
2023-03-14

Curl允许通过指定证书和私钥文件来发出双向SSL请求,如下面的两个curl请求

>

  • 首先获取访问令牌:

    $ curl https://connect2.server.com/auth/token < br >-H "授权:Basic $ Basic _ AUTH " < br >-cert ~/certs/cert path/full chain . PEM < br >-key ~/certs/cert path/privkey . PEM

    然后使用令牌访问API:

    $ curl https://connect2.server.com/api/public/preview1/orgs/$ORGUUID/API -
    H “Authorization: Bearer $ACCESS_TOKEN” --cert ~/certs/certpath/
    fullchain.pem -
    -key ~/certs/certpath/privkey.pem

    问题:

    如何在Java中实现上述请求?需要什么库?Java似乎使用p12文件,但是,我们有.pem文件。

  • 共有2个答案

    裴英锐
    2023-03-14

    以下是步骤

    步骤1。将PEM证书转换为P12格式

    openssl pkcs12 -export -out cacert.p12 -inkey /etc/letsencrypt/archive/server/privkey21.pem -in /etc/letsencrypt/archive/server/cert21.pem -certfile /etc/letsencrypt/archive/server/chain21.pem -passin pass:PWD -passout pass:PWD
    

    步骤2。(可选,不需要)将证书P12转换为JKS格式

    keytool -importkeystore -srckeystore cacert.p12 -srcstoretype pkcs12 -destkeystore cacert.jks
    

    第3步。通过SSLSocketFactory将证书添加到HTTP POST请求

    /**
    * This function is responsible to create createSSLSocketFactory with SSL certificate
    * @return
    */
    public static SSLSocketFactory createSSLSocketFactory(){
          try 
          {
                 FileInputStream f5 = new FileInputStream(new File("/etc/letsencrypt/archive/server/cacert21.p12"));
                 KeyManagerFactory kmf = KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());
                 KeyStore ks1 = KeyStore.getInstance(KeyStore.getDefaultType());
                 ks1.load(f5, "PWD".toCharArray());
                 kmf.init(ks1, "PWD".toCharArray());
                 
                 SSLContext sslContext = SSLContext.getInstance("SSL");
                 sslContext.init(kmf.getKeyManagers(), null, null);
                 
                 f5.close();
                 return sslContext.getSocketFactory();
          }
          catch (Exception e) {
                 e.printStackTrace();
                 return null;
          }
    }
    
    柴彬
    2023-03-14

    1.您可以使用openssl pkcs12-index将PEM私有密钥加链转换为PKCS12文件。这不是编程或开发,这里不再是主题,但是这里有几十个关于这个的问题,可以追溯到很多年前,当时主题更广泛,以及在其他堆栈中(security.SX、服务器故障、超级用户,也许更多)。

    ‌2.如果您没有或不喜欢OpenSSL,您可以使用以下软件将这些文件(以及其他文件)读取到任何类型的Java密钥库(JCEKS、JKS、PKCS12和您可能不想要的几个BouncyCastle变体)中https://www.keystore-explorer.org . 这也是离题的,我看到一些现有的Q提到了这一点,但并不多。

    ‌3.如果你想用你自己的代码来做这件事,这是ontopic,并且假设你的curl使用OpenSSL或者至少那些文件是OpenSSL格式:

    3.0 Java可以使用< code > certificate factory . getinstance(" x . 509 ")读取PEM证书序列,然后< code >生成certificates(InputStream)(注s) -该文档有点粗略,但该方法实际上可以将单独的证书处理为DER或PEM(显然已经有了),或者将包含证书的PKCS7处理为单个blob(通常称为p7b或p7c),同上。

    3.1如果该私钥文件是PKCS8未加密的,即如果PEM标签是<code>BEGIN/END PRIVATE KEY</code>,并且两者之间没有其他单词,则这种情况可以由标准Java处理,假设您知道它是用于什么算法(如有必要,您可以从第一个=leaf证书中确定)。删除BEGIN/END行,并忽略换行符(使用base64.getMimeDecoder())或在删除换行符后使用.getDecoder。将结果放入PKCS8EncodedKeySpec中,并将其馈送到KeyFactory实例中的generatePrivate以获取正确的算法。

    3.2 BouncyCastle(bcpkix bcprov)可以通过PEMParserJcaPEMKeyConverter读取OpenSSL使用的所有私有密钥的PEM格式,如果适用,还可以使用DecryptorBuilder。您可以使用这个相当独特的类名找到许多现有的Qs。这确实意味着对Bouncy的依赖。

    3.3如果你没有或不想要Bouncy,并且有一种不是PKCS8未加密的格式,生活就会变得更加艰难。你可以通过使用OpenSSL将私钥文件转换为PKCS8未加密来避免这种情况,让你回到#3.1,但是如果你这样做了,你还不如回到#1,使用OpenSSL一次将批次转换为PKCS12。

    >

  • 如果你有一个OpenSSL“传统”算法特定的格式,如BEGIN/END RSA PRIVATE KEYBEGIN/END ECPRIVATE KEY,并且BEGIN后面的前两行不是Proc类型:4和DEK-info,你可以通过在前面添加一个(DER)前缀来指定算法并“包装”特定于算法的部分,从而对正文进行base64解码并将其转换为PKCS8。我认为这有骗局,但我目前找不到;如果这种情况适用并且您确定了算法,我将添加它。

    如果你有一个“传统”格式,确实有Proc类型:4和DEK-info,或者你有开始/结束加密的私钥,这些是加密的。仅使用标准 Java 来理解它们是一项相当多的工作,只有当您无法使用其他选项并准确指定您的情况时,我才会这样做。

  •  类似资料:
    • 问题内容: 我有以下CURL请求,谁能请我确认subesquest HTTP请求是什么? 会是这样吗? 任何人都可以帮助我将上述curl请求完全转换为httpreq。 提前致谢。 苏维 问题答案: 有很多方法可以实现这一目标。在我看来,以下一项是最简单的,同意它不是很灵活,但是可以工作。

    • 我向我的flask应用所在的服务器发出了python post请求。它运行良好,我能够获得所需的数据。 但我想用POSTMAN测试API。我无法做到这一点,因为在某种程度上我对邮递员并不熟悉。 下面是我的python代码。 我正在努力解决这样一个问题:我试图发布到服务器上的数据和文件应该是原始json还是表单数据,或者是正文的x-www-form-urlencoded部分。还有实际的结构应该是什么

    • 我正在尝试为我的PHP网站使用外展API。关于外联,这是他们提到的要求: 邮递https://api.outreach.io/api/v2/prospects {“data”:{“attributes”:{“firstName”:“Test_3”,“lastName”:“API”},“type”:“prospect”} 在PHP中,我将其转换为以下代码,但它给出了错误“错误请求”。请帮助我我做错了

    • 我想将请求从Python代码转换为Power BI Power Query中使用的M 我的Python代码是 \\ 导入请求将日期时间导入为dt 标头={'Authorization':'Bearer tok_123','Accept':'text/csv'} URL='https://api.123/' 参数=(('start\u time',start\u date),('end\u time

    • 我正在尝试将curl中的以下工作请求转换为python请求(使用请求http://docs.python-requests.org/en/v0.10.7/). (请注意,我使用了一个假url,但该命令确实适用于真实url) 接收端(在烧瓶中运行)执行以下操作: 在curl(7.30)中,在Mac OS X(10.9)上运行,上面的命令正确返回使用标记查询过滤的json列表。 我的python脚本如

    • 我试图使用Postman而不是Web服务的API文档提供的终端命令来请求数据。 curl命令如下: 我怎么能在邮递员内申请这个?我尝试添加和作为请求参数,但这不起作用

    • 所以我得到了这个简单的HTML表单 这允许我上传一个映像并将其发布到服务器上,在服务器上由“upload.php”脚本处理。 如下所示 如果可以在JavaScript中完全做到这一点,我很想知道。 周末愉快:)

    • 问题内容: 我正在寻找一种将a 转换为或更具体地以将“迭代器”作为流“查看”的简洁方法。 出于性能原因,我想避免在新列表中复制迭代器: 根据评论中的一些建议,我也尝试使用: 但是,我得到了(因为没有调用hasNext) 我已经看过和,但我没有发现任何东西。 问题答案: 一种方法是从迭代器创建一个拆分器,并将其用作流的基础: 一个可能更易读的替代方法是使用Iterable-使用lambda从Iter