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文件。
以下是步骤
步骤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;
}
}
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)可以通过
PEMParser
和JcaPEMKeyConverter
读取OpenSSL使用的所有私有密钥的PEM格式,如果适用,还可以使用DecryptorBuilder
。您可以使用这个相当独特的类名找到许多现有的Qs。这确实意味着对Bouncy的依赖。
3.3如果你没有或不想要Bouncy,并且有一种不是PKCS8未加密的格式,生活就会变得更加艰难。你可以通过使用OpenSSL将私钥文件转换为PKCS8未加密来避免这种情况,让你回到#3.1,但是如果你这样做了,你还不如回到#1,使用OpenSSL一次将批次转换为PKCS12。
>
如果你有一个OpenSSL“传统”算法特定的格式,如BEGIN/END
RSA PRIVATE KEY
或BEGIN/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