【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

单向验证:

第一步:生成密钥:

在单向验证中,首先需要生成一个密钥。以下是生成密钥的命令:

keytool -genkey -alias mykey -keyalg RSA -keystore d:/key/testkeykeytool -export -file d:/key/testkey.crt -alias mykey -keystore d:/key/testkey

【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

由于是在本地进行测试,请修改本地的hosts文件,路径为C:WindowsSystem32driversetchosts,添加以下内容:

# localhost name resolution is handled within DNS itself.#    127.0.0.1       localhost#    ::1             localhost127.0.0.1 www.xiaochangwei.com

这样就可以通过域名进行访问。

第二步:配置Tomcat

在Tomcat的配置文件中,找到并启用HTTPS连接器。以下是基本的配置:


请注意,这段代码默认是注释掉的,需要手动取消注释。根据需要可以修改默认的端口,默认端口为8443。

在非Windows环境下,可能会遇到找不到密钥或密钥强度不足的问题,导致Tomcat无法正常启动或页面无法访问。解决方法如下:

为密钥文件添加后缀,以便非Windows环境识别。增加密钥的复杂度。

完整配置如下:


第三步:发布项目

【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

项目已经成功发布,且端口可用。测试端口情况:

【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证

从测试结果看,端口可以正常访问,证明部署成功。

参考资料:https://www.php.cn/link/813c26fc0c3bf64573a10eafb3f8e5ee

双向验证

在双向验证中,需要生成服务器和客户端的证书,并进行相互信任配置。以下是相关的命令:

为服务器生成证书keytool -genkey -v -alias server -keyalg RSA -keystore d:key2server.keystore -validity 36500

为客户端生成证书keytool -genkey -v -alias client -keyalg RSA -storetype PKCS12 -keystore d:key2client.key.p12

导入客户端证书让服务器信任客户端证书

  1. 先把客户端证书导出为cer文件格式keytool -export -alias client -keystore d:key2client.key.p12 -storetype PKCS12 -storepass 123456 -rfc -file d:key2client.key.cer

  2. 将客户端cer导入到服务器证书库keytool -import -v -file d:key2client.key.cer -keystore d:key2server.keystore

  3. 查看安装结果keytool -list -keystore d:key2server.keystore

让客户端信任服务器证书

  1. 把服务器证书导出为cer文件keytool -keystore d:key2server.keystore -export -alias server -file d:key2server.cer

  2. 在客户端安装服务器证书选择受信任的根证书颁发机构

配置Tomcat

HTTP接口的调用本质上是通过地址建立连接,获取返回信息或发送请求数据,完成业务逻辑后关闭连接。可以使用原生态的接口调用方式或采用RESTful风格进行调用。如果需要调用多个HTTP接口,建议使用RESTful进行统一管理,使代码更加清晰。

在调用HTTPS接口时,如果对方项目使用双向验证,则需要提供证书和密码等信息。以下是绕过HTTPS验证的参考代码:

import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.HttpVersion;import org.apache.http.client.HttpClient;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.apache.http.params.BasicHttpParams;import org.apache.http.params.HttpConnectionParams;import org.apache.http.params.HttpParams;import org.apache.http.params.HttpProtocolParams;import org.apache.http.protocol.HTTP;

public class HttpsClient {static public HttpClient newHttpsClient() {try {KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());trustStore.load(null, null);SSLSocketFactory sf = new MySSLSocketFactory(trustStore);sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);HttpParams params = new BasicHttpParams();HttpProtocolParams.setVersion(params, HttpVersion.HTTP_1_1);HttpProtocolParams.setContentCharset(params, HTTP.UTF_8);HttpConnectionParams.setConnectionTimeout(params, 10000);HttpConnectionParams.setSoTimeout(params, 10000);SchemeRegistry registry = new SchemeRegistry();registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), 80));registry.register(new Scheme("https", sf, 443));ClientConnectionManager ccm = new ThreadSafeClientConnManager(params, registry);return new DefaultHttpClient(ccm, params);} catch (Exception e) {return new DefaultHttpClient();}}

private static class MySSLSocketFactory extends SSLSocketFactory {    SSLContext sslContext = SSLContext.getInstance("TLS");    public MySSLSocketFactory(KeyStore truststore)            throws NoSuchAlgorithmException, KeyManagementException,            KeyStoreException, UnrecoverableKeyException {        super(truststore);        TrustManager tm = new X509TrustManager() {            public void checkClientTrusted(X509Certificate[] chain, String authType)                    throws CertificateException {            }            public void checkServerTrusted(X509Certificate[] chain, String authType)                    throws CertificateException {            }            public X509Certificate[] getAcceptedIssuers() {                return null;            }        };        sslContext.init(null, new TrustManager[] { tm }, null);    }    @Override    public Socket createSocket(Socket socket, String host, int port, boolean autoClose)            throws IOException, UnknownHostException {        return sslContext.getSocketFactory().createSocket(socket, host, port, autoClose);    }    @Override    public Socket createSocket() throws IOException {        return sslContext.getSocketFactory().createSocket();    }}

}

受此启发,在使用RESTful风格进行HTTP接口调用时,可以通过修改初始化的HttpClient来实现。以下是RESTful风格的HTTP接口调用示例代码,注意需要引入RestTemplate(在spring-web.jar中):

package com.xxx.rpc.restclient.utils;

import java.io.IOException;import java.net.Socket;import java.net.UnknownHostException;import java.security.KeyManagementException;import java.security.KeyStore;import java.security.KeyStoreException;import java.security.NoSuchAlgorithmException;import java.security.UnrecoverableKeyException;import java.security.cert.CertificateException;import java.security.cert.X509Certificate;import java.text.SimpleDateFormat;import java.util.Date;import javax.net.ssl.SSLContext;import javax.net.ssl.TrustManager;import javax.net.ssl.X509TrustManager;import org.apache.http.client.HttpClient;import org.apache.http.conn.ClientConnectionManager;import org.apache.http.conn.scheme.PlainSocketFactory;import org.apache.http.conn.scheme.Scheme;import org.apache.http.conn.scheme.SchemeRegistry;import org.apache.http.conn.ssl.SSLSocketFactory;import org.apache.http.impl.client.DefaultHttpClient;import org.apache.http.impl.conn.tsccm.ThreadSafeClientConnManager;import org.slf4j.Logger;import org.slf4j.LoggerFactory;import org.springframework.http.HttpEntity;import org.springframework.http.HttpHeaders;import org.springframework.http.HttpStatus;import org.springframework.http.ResponseEntity;import org.springframework.http.client.HttpComponentsClientHttpRequestFactory;import org.springframework.util.StringUtils;import org.springframework.web.client.RestTemplate;

@SuppressWarnings("deprecation")public class HttpClientUtils {private static Logger logger = LoggerFactory.getLogger(HttpClientUtils.class);

private static String HTTP_PROTOCOL = "https://";public static ResponseEntity Execute(FrontInfo frontInfo) {    HttpClient httpClient = null;    try {        KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());        trustStore.load(null, null);        SSLSocketFactory sf = new MySSLSocketFactory(trustStore);        sf.setHostnameVerifier(SSLSocketFactory.ALLOW_ALL_HOSTNAME_VERIFIER);        SchemeRegistry registry = new SchemeRegistry();        registry.register(new Scheme("http", PlainSocketFactory.getSocketFactory(), Integer.valueOf(frontInfo.getPort())));        registry.register(new Scheme("https", sf, Integer.valueOf(frontInfo.getPort())));        ClientConnectionManager ccm = new ThreadSafeClientConnManager(registry);        httpClient = new DefaultHttpClient(ccm);    } catch (Exception e) {        logger.info("httpclient创建错误.");    }    HttpComponentsClientHttpRequestFactory httpComponentsClientHttpRequestFactory = new HttpComponentsClientHttpRequestFactory(httpClient);    httpComponentsClientHttpRequestFactory.setConnectTimeout(120 * 1000);    httpComponentsClientHttpRequestFactory.setReadTimeout(120 * 1000);    RestTemplate rt = new RestTemplate(httpComponentsClientHttpRequestFactory);    String url = HttpClientUtils.generateUrl(frontInfo);    HttpEntity requestEntity = HttpClientUtils.generateHttpEntity(frontInfo);    try {        System.out.println("httpMethod = " + frontInfo.getHttpMethod());        System.out.println("url = " + url);        System.out.println("requestEntity = " + requestEntity);        ResponseEntity responseEntity =                rt.exchange(url, frontInfo.getHttpMethod(), requestEntity, String.class);        logger.debug("responseEntity = [{}].", responseEntity);        System.out.println("responseEntity = " + responseEntity);        return responseEntity;    } catch (Exception e) {        System.out.println("info: " + e.getMessage());        logger.debug("error info:  = [{}].", e.getMessage());        return generateRespWhenException(e);    }}

}

由于这是商业项目的代码,这里仅展示部分代码。通过这个示例可以完全掌握RESTful相关技术。需要解释的是:

frontInfo是一个通用的参数对象,用于确保接口调用方式统一,包含各接口需要的参数名等,如IP、端口、URL、方法、用户名等。generateUrl方法根据通用参数对象及条件生成具体的URL,如https://www.php.cn/link/b7c341015338340fc8cc5c21e0473579generateHttpEntity方法根据具体业务需求增加一些通用的头信息。exchange方法执行具体的请求,返回ResponseEntity,然后根据具体业务返回,进行解析。调用后解析返回信息大致如下,解析其中的body:

JSONObject object = JSONObject.parseObject(response.getBody().toString());JSONObject userJson = JSONObject.parseObject(object.getString("user"));String uuid = userJson.getString("id");

至此,RESTful使用方式介绍完毕。

以上就是【tomcat】HTTPS访问配置 + restful调用远程HTTPS绕过验证的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/112022.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MAC输入法怎么快速打出表情和符号_MAC输入法快速打出表情和符号教程
上一篇 2025年11月23日 18:45:01
手动安装SublimeText插件的详细教程
下一篇 2025年11月23日 18:47:04

相关推荐

  • VSCode如何实现代码版本对比 VSCode Git差异对比的高效使用方法

    vscode通过scm视图直接对比工作区与head的差异;2. 点击已暂存文件可查看暂存区与head的差异;3. 通过命令面板、scm历史记录或右键菜单可对比任意版本或文件;4. 差异视图支持并排和内联模式,并提供跳转导航;5. 时间线视图可追溯文件级提交历史并对比各版本;6. gitlens扩展增…

    2026年9月23日
    500
  • mysql索引怎么用 mysql创建索引提高查询性能方法

    mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法mysql索引怎么用 mysql创建索引提高查询性能方法

    索引是mysql中提高查询性能的关键工具,它类似于书籍目录,可快速定位数据。创建索引主要使用create index或alter table语句,例如:create index idx_email on users (email); 或 alter table users add index idx…

    2026年9月23日 用户投稿
    000
  • Java中基于栈验证JSON字符串结构有效性的方法

    本文探讨了在Java中利用栈(Stack)数据结构验证JSON字符串结构有效性的方法。我们将分析一个常见的基于栈的实现示例,指出其在处理字符串内部字符、引号平衡以及转义字符方面的潜在缺陷。文章将提供一个改进的解决方案,并强调此方法主要用于结构匹配,而非完整的JSON语法验证,同时建议生产环境中使用专…

    2026年9月23日
    100
  • 快手极速版官方网页版地址_快手极速版App下载官网首页

    快手极速版官方网页版地址在哪里?这是不少网友都关注的,接下来由PHP小编为大家带来快手极速版官方网页版地址及App下载相关信息,感兴趣的网友一起随小编来瞧瞧吧! https://www.kuaishou.com/ 1、小步骤内容。进入官网后可直接浏览平台首页推荐内容,涵盖生活记录、才艺展示等多个领域…

    2026年9月23日
    200
  • Flink项目实践 | Flink 单机安装部署

    Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署Flink项目实践 | Flink 单机安装部署

    apache flink 是一个用于对无界和有界数据流进行状态计算的框架和分布式处理引擎。flink 设计旨在所有常见集群环境中运行,并以内存速度和任意规模进行计算。 为了深入了解 Flink,首先需要搭建其运行环境。 Flink 可以在所有类似 UNIX 的环境中运行,包括 Linux,Mac O…

    2026年9月23日 用户投稿
    200
  • Windows系统安装MySQL的完整步骤是什么?

    Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?Windows系统安装MySQL的完整步骤是什么?

    安装#%#$#%@%@%$#%$#%#%#$%@_81c++3b080dad537de7e10e0987a4bf52e前需准备系统兼容性、硬件资源、前置运行时库、管理员权限及排查端口冲突。1. 系统兼容性:确保使用windows 10/11或对应server版本;2. 硬件资源:建议至少4gb内存;…

    2026年9月23日 用户投稿
    100
  • 如何在AdobeFresco导出AI生成的画作?快速保存图像的教程

    答案:Adobe Fresco支持PNG、JPG、PSD、PDF和MP4等导出格式。PNG适合透明背景和高质量网络展示;JPG适用于小文件、快速分享的有损压缩图像;PSD保留图层与矢量信息,便于在Photoshop中继续编辑;PDF适合打印和跨平台文档共享;MP4用于导出创作延时视频。选择格式时需根…

    2026年9月23日
    100
  • windows8的索引服务怎么关闭以提高性能_windows8关闭索引服务提升速度的方法

    1、可通过禁用Windows Search服务或调整索引范围解决Win8.1硬盘频繁读写问题;前者彻底关闭服务,后者减少索引范围以降低资源占用。 如果您在使用Windows 8系统时发现硬盘频繁读写,影响了整体运行效率,这可能是由于索引服务持续工作导致的。关闭或调整该服务可能有助于提升系统响应速度。…

    2026年9月23日
    000
  • Windows 11 截图工具更新,支持即时标注

    微软近期为其内置的截图工具带来了一项重要升级,正式引入即时标注功能,目前该功能正逐步向所有用户推送。 过去,尽管截图工具和画图应用已支持添加文本框或标记内容,但用户必须先将截图保存,或手动打开相关程序后才能进行编辑操作。 通常情况下,当用户使用鼠标拖选区域时,系统会立即完成截图并自动存入默认的库文件…

    2026年9月23日
    000
  • VSCode配置MacOS C环境 详细图解VSCode搭建C++开发

    在mac++os上用vscode配置c/c++环境的关键是安装xcode command line tools以获取clang编译器和lldb调试器,然后安装vscode的c/c++扩展,接着创建项目文件夹和源文件,通过配置tasks.json定义编译任务,确保使用clang编译当前文件并生成可执行…

    2026年9月23日
    100
  • Java JSON字符串有效性验证:基于栈的实现与常见陷阱

    本文深入探讨了使用Java栈结构验证JSON字符串有效性的方法。通过分析一个常见错误示例,详细阐述了在处理括号、方括号以及字符串引号时的正确逻辑,特别强调了字符串内部字符(包括转义字符)不应影响结构平衡的原则,并提供了改进思路,旨在帮助开发者构建健壮的JSON验证器。 JSON结构与栈的适用性 JS…

    2026年9月23日
    000
  • win11玩游戏时突然黑屏但电脑还在运行怎么办_win11游戏黑屏但电脑正常运行解决方案

    黑屏但主机运行时可尝试重启资源管理器、更新显卡驱动、修复系统文件及调整注册表设置。首先通过任务管理器重启Windows资源管理器;若无效,则在设备管理器中更新或回滚显卡驱动;接着以管理员身份运行命令提示符,执行sfc /scannow和DISM命令修复系统文件;最后修改注册表HKEY_CURRENT…

    2026年9月23日
    100
  • Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法Snagit的AI工具怎么裁剪图片?教你精准完成图片裁剪方法

    Snagit虽无一键AI裁剪,但通过魔棒、智能移动等智能工具辅助选区,结合裁剪功能可高效精准裁剪;关键在于利用颜色识别与对象分离技术提升效率,避免纯手动操作,再通过调整比例、放大细节、善用撤销等功能优化结果。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R…

    2026年9月23日 用户投稿
    000
  • Java javac 命令与当前工作目录解析

    在Java编译环境中,javac命令的“当前目录”指的是命令被执行的物理位置,而非源文件所在的目录。理解这一概念对于正确配置和管理Java项目的编译路径至关重要,特别是当默认的classpath设置为.时,它决定了编译器查找类文件的起点。 1. javac 命令与当前工作目录的定义 在操作系统中,当…

    2026年9月23日
    100
  • 苹果 iPhone Air 今日正式发售:仅支持 eSIM,起售价 7999 元

    10 月 22 日消息,苹果全新 iphone air 于今日上午 8:00 正式开售,起售价定为 7999 元。值得关注的是,该机型仅支持 esim 功能,用户需持本人有效身份证件前往运营商实体营业厅完成实名核验与服务激活。现阶段仍处于商用试验阶段,暂未开放线上办理通道。 iPhone Air 搭…

    2026年9月23日
    200
  • VSCode调试JavaScript代码(详细图解,前端必学技能)

    掌握VSCode调试JavaScript需先安装Node.js和VSCode,创建项目及app.js文件后,配置launch.json,设置断点并启动调试,通过变量面板和控制台检查值,结合条件断点、日志点、监听表达式等技巧提升效率;调试浏览器代码需安装Chrome或Edge调试插件,配置url和we…

    2026年9月23日
    200
  • Bash Shell 中单引号和双引号的区别

    Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别Bash Shell 中单引号和双引号的区别

    在 linux 命令行中,引号是处理文件名中的空格和特殊字符的常用工具。引号在 shell 脚本中具有“特殊功能”,可能让初学者感到困惑。让我们详细探讨不同类型的引号字符及其在 shell 脚本中的用法。 有四种不同类型的引号字符: 单引号 ‘双引号 “反斜杠 反引号 ` 除…

    2026年9月23日 用户投稿
    500
  • windows11如何查看和导出事件查看器日志_windows11事件日志导出方法

    首先打开事件查看器,通过Win+R输入eventvwr.msc或右键开始菜单进入;接着在Windows日志中查看系统、安全和应用程序日志,双击事件查看详情;然后可按级别、来源或时间筛选日志;最后右键日志类型选择“将所有事件另存为”,支持.evtx、.txt或.csv格式导出文件用于分析或存档。 如果…

    2026年9月23日
    600
  • Linux中如何查看服务日志?journalctl与syslog使用指南

    Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南Linux中如何查看服务日志?journalctl与syslog使用指南

    排查linux服务问题时,首选journalctl或syslog类系统查看日志。journalctl适用于systemd系统,可查看内核消息、服务启动输出等,支持按时间、单元、优先级过滤;syslog适用于传统系统,需服务主动发送日志,支持集中管理。掌握两者使用能有效定位问题。 在Linux系统中排…

    2026年9月23日 用户投稿
    100
  • Java语法基础中main方法为什么必须是public static void

    Main方法必须声明为public static void以确保JVM能无访问限制地通过类名直接调用,且不依赖对象实例或返回值,符合JVM规范对程序入口的强制要求。 Main方法是Java程序的入口点,它的标准声明形式为:public static void main(String[] args)。…

    2026年9月23日
    200

发表回复

登录后才能评论
关注微信