使用 BouncyCastle 进行简单的 HTTPS 查询

2023-12-22

下面是我用来执行简单 HTTPS 请求的代码的简化版本:

// Assume the variables host, file and postData have valid String values

final URL url = new URL("https", host, file);
final HttpURLConnection connection = (HttpURLConnection) url.openConnection();

connection.setRequestMethod("POST");
connection.setDoInput(true);
connection.setDoOutput(true);
connection.setRequestProperty("Content-length", String.valueOf(postData.length()));

final DataOutputStream output = new DataOutputStream(connection.getOutputStream());
output.writeBytes(postData);
output.close();

final InputStream input = new DataInputStream(connection.getInputStream());

for (int c = input.read(); c != -1; c = input.read()) {
  System.out.print((char) c);
}

System.out.println();

input.close();

过去,这对于连接到我们的服务器非常有效(如果我使用 http 作为协议,仍然有效),直到最近完成了一些安全升级。

现在它给我这个问题中提到的“无法生成 DH 密钥对”和“质数大小必须是 64 的倍数,并且只能范围从 512 到 1024(含)”错误:

Java:为什么 SSL 握手会出现“无法生成 DH 密钥对”异常? https://stackoverflow.com/questions/6851461/java-why-does-ssl-handshake-give-could-not-generate-dh-keypair-exception

事实证明这是 Java 中的一个已知错误,建议使用 BouncyCastle 的 JCE 实现。

我的问题是......我如何使用 BouncyCastle 来做这样的事情?或者还有更多的选择吗?

免责声明:我对密码学和使 HTTPS 查询成为可能的底层技术知之甚少,也没有兴趣。相反,我更愿意专注于我的应用程序逻辑,并让各种库处理低级问题。

我查看了 BouncyCastle 网站和文档,并通过 Google 搜索来了解有关 JCE 等的更多信息,但总而言之,它相当令人难以承受,而且我无法找到任何简单的代码示例来执行类似上述代码的操作。


以下示例代码使用jdk1.6.0_45和bcprov-jdk15on-153.jar执行简单的https查询:

import java.io.IOException;
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.net.Socket;

import org.bouncycastle.crypto.tls.CertificateRequest;
import org.bouncycastle.crypto.tls.DefaultTlsClient;
import org.bouncycastle.crypto.tls.TlsAuthentication;
import org.bouncycastle.crypto.tls.TlsClientProtocol;
import org.bouncycastle.crypto.tls.TlsCredentials;

public class TestHttpClient {
    // Reference: http://boredwookie.net/index.php/blog/how-to-use-bouncy-castle-lightweight-api-s-tlsclient/
    //            bcprov-jdk15on-153.tar\src\org\bouncycastle\crypto\tls\test\TlsClientTest.java
    public static void main(String[] args) throws Exception {
        java.security.SecureRandom secureRandom = new java.security.SecureRandom();
        Socket socket = new Socket(java.net.InetAddress.getByName("www.google.com"), 443);
        TlsClientProtocol protocol = new TlsClientProtocol(socket.getInputStream(), socket.getOutputStream(),secureRandom);
        DefaultTlsClient client = new DefaultTlsClient() {
            public TlsAuthentication getAuthentication() throws IOException {
                TlsAuthentication auth = new TlsAuthentication() {
                    // Capture the server certificate information!
                    public void notifyServerCertificate(org.bouncycastle.crypto.tls.Certificate serverCertificate) throws IOException {
                    }

                    public TlsCredentials getClientCredentials(CertificateRequest certificateRequest) throws IOException {
                        return null;
                    }
                };
                return auth;
            }
        };
        protocol.connect(client);

        java.io.OutputStream output = protocol.getOutputStream();
        output.write("GET / HTTP/1.1\r\n".getBytes("UTF-8"));
        output.write("Host: www.google.com\r\n".getBytes("UTF-8"));
        output.write("Connection: close\r\n".getBytes("UTF-8")); // So the server will close socket immediately.
        output.write("\r\n".getBytes("UTF-8")); // HTTP1.1 requirement: last line must be empty line.
        output.flush();

        java.io.InputStream input = protocol.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(input));
        String line;
        while ((line = reader.readLine()) != null)
        {
            System.out.println(line);
        }
    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 BouncyCastle 进行简单的 HTTPS 查询 的相关文章

随机推荐

  • 初学iphone问题:画一个矩形。我究竟做错了什么?

    试图找出我在这里做错了什么 已经尝试了几种方法 但我从未在屏幕上看到那个难以捉摸的矩形 现在 这就是我想做的一切 只需在屏幕上绘制一个矩形 除了 CGContextSetRGBFillColor 之外 我在所有内容上都收到 无效上下文 之后
  • torch.nn.CrossEntropyLoss 多个批次

    我目前正在与torch nn CrossEntropyLoss 据我所知 批量计算损失是很常见的 但是 是否有可能计算多个批次的损失 更具体地说 假设我们给出了数据 import torch features torch randn no
  • .Net Core (2.1) - Lambda 函数可以工作,而在 2.2 中却不能工作?

    我使用 Net Core 2 1 创建了一个简单的空 AWS Lambda 函数 这是文件夹结构 这里是csproj https gist github com RoyiNamir ee639c6b66bd295e0bc5569c45334
  • Process.Start 权限 - 不在 iis7 服务器上执行

    我有一个使用 asp net 模拟的网站 asp net mvc 我使用 web config 元素模拟管理员用户 我尝试通过 Process start 执行进程 我尝试启动 bat 文件 我为 iis 管理服务启用了与桌面的交互 我没有
  • t-sql NOT IN 包含多列

    我有一个 Microsoft SQL 数据库 我试图在其中插入一些数据 我在 4 列上有一个唯一键 我想将多个表中的数据插入到该表中 同时检查数据以确保它不会违反键的唯一性 如果我在单个列上执行此操作 我会执行 NOT IN 就像这样 IN
  • Enter 因隐藏按钮而无法在 IE 中提交表单

    我有一个带有两个按钮的表单 第一个是使用 Javascript 隐藏的 当我在 IE 中的文本字段中按 Enter 键时 表单不会提交 我认为这是因为它选择了第一个按钮作为默认提交按钮 但由于该按钮被隐藏 因此它不起作用 我通过在 Ente
  • 如何在 matlab 中使用 theta/rho 数据绘制直线

    如题 我只有 theta rho 数据 直线方程为 x cos theta y sin theta rho 如何在matlab中用这些数据绘制线 有没有输入为 theta 和 rho 的函数 thanks 只需使用一些简单的代数即可了解如何
  • 如何在询问槽后捕获IBM Watson Assistant中一个实体的多个值?

    在我的 Watson Assistant 应用程序中 我想要捕获上下文中的多个实体 并且还有一个槽位来向用户提问 这是一个例子 用户 我想从 多伦多 飞往 波士顿 Watson 正确检测到 intent booking city Toron
  • jQuery 摆脱嵌套的 ajax 函数

    在我的JS中 我需要使用AJAX获取3个文件的内容 然后执行一些代码 这导致了嵌套异步函数的创建看起来相当奇怪 另外 每当我使用异步函数时 就会出现这种丑陋的嵌套 当我真的只想等待每个函数完成时 如何避免嵌套函数 如果有帮助的话我正在使用
  • 如何自动启动、执行和停止EC2?

    我想每天在 GPU 机器上测试一次我的 Python 库 我决定使用AWS EC2进行测试 但是gpu机器的费用很高 所以我想在测试结束后停止实例 因此 我想每天自动执行以下操作一次 启动 EC2 实例 手动设置 执行命令 测试 gt 将日
  • 在 VSCode 扩展中找不到命令

    我正在尝试创建 VSCode 扩展 这个扩展提供了两个命令 不用管它们的实现 export function activate context ExtensionContext const provider new ContentProvi
  • 如何对用户密码进行哈希处理?

    请不要将其标记为重复 因为我已经检查了多个帖子 但没有一个对我有帮助 Asp net MVC 如何哈希密码 https stackoverflow com questions 39802164 asp net mvc how to hash
  • 日期无效时引发错误

    我想做的是在日期超出支持范围的情况下引发超出范围错误 就像类型转换所做的那样 我在 CentOS 上使用 PostgreSQL 9 1 6 问题如下 postgres select to date 20130229 yyyymmdd to
  • 如何展平 Observable 中的 Observable 数组

    我正在尝试展平嵌套的 Observable 但我没有让它工作 this af object test father map res gt res namedKeys for let el in res keys res namedKeys
  • 为什么不建议在头文件中定义宏?

    The 谷歌 C 风格指南 http google github io styleguide cppguide html Preprocessor Macros指南建议宏不得定义在 h 头 文件 这样做有什么坏处 预处理器将所有包含的源文件
  • C# 文件大小限制

    我有一个使用 ASP NET NET 2 0 构建的网站 我的业务逻辑中有很多类 我将它们全部保存在一个文件 BL cs 中 我现在已经到了这个文件中有 11 000 行代码的阶段 这是一个问题吗 我应该将其分成几个文件 每个类位于不同的文
  • Ruby:带有 JSON 主体的 PUT 请求?

    我需要创建一个HTTP PUT 请求使用红宝石 该请求有一个JSON 正文 我能够使用以下方法生成 JSON 正文 require rubygems require json jsonbody JSON generate message g
  • html/css 中的楼梯步进文本

    是否有使用 HTML CSS 在网站上阶梯式文本的最佳实践方法 这个单词 and https i stack imgur com eEMe5 png说明了效果 使用CSS属性vertical align带有百分比值 参见MDN 上的此部分
  • 为什么使用 Typescript - Angular2 进行类型定义 (.d.ts)?

    我已经看过其他SO问题了 但仍然对我的问题感到困惑 我见过很多使用的例子Jquery js Toastr js 无需打字的烤面包机 http plnkr co edit VEMcA3SnYtQ35GzVgt80 p preview和别的JS
  • 使用 BouncyCastle 进行简单的 HTTPS 查询

    下面是我用来执行简单 HTTPS 请求的代码的简化版本 Assume the variables host file and postData have valid String values final URL url new URL h