Android与服务端使用Https加密通信

Android与服务端使用Https加密通信

大家好,又见面了,我是全栈君。

Https证书

现在网络安全越来越受重视,通用做法是采用https加密通信,使用https需要数字证书,只有合法的证书才能被浏览器、操作系统默认支持,而所谓的合法证书是在CA公司那购买的(原来我们的合法性是花钱从别人那买来的,不得不吐槽这种互联网安全设计真是坑爹),虽然现在也有一些免费CA证书,但申请还是挺麻烦,这里我们使用自己生成的https证书。

服务端使用https

生成https证书

JDK自带的keytool工具可以很方便生成https证书,可以查看它的使用方法:

比如这条命令就可以生成一个有效期10年的证书:

keytool -genkey -alias spring -validity 3560 -keystore spring.keystore复制代码

服务端配置https证书

服务端一般使用Tomcat、Jetty、Undertow等作为Servlet容器,我们将上面生成的keystore证书放在项目中,然后在配置文件中引入证书即可:

server.ssl.key-store=spring.keystore
server.ssl.key-alias=spring
server.ssl.key-password=password
server.ssl.key-store-type=JKS复制代码

这样服务端就支持https了,启动项目访问服务就要加https前缀,如 https://localhost:8080/user

Android自定义https校验

如果是花钱买的CA证书是不需要额外配置的,Android系统内部有信任列表,会自行校验通过,这里讲配置自定义https校验。

Android端通常使用 Retrofit 做网络请求,Retrofit底层就是OKhttp,OKhttp实现自定义https校验并不难,主要分三步。

把证书公钥预埋在APP中

这条命令可以导出证书公钥字符串:

keytool -list -rfc -keystore tomcat.keystore复制代码

把这个公钥作为一个字符串常量放在项目中供后面校验使用。

自定义证书校验逻辑

使用上面的公钥字符串构建X509TrustManager对象,在checkServerTrusted方法中校验服务端证书:

X509TrustManager trustManager = new X509TrustManager() {
@Override
public void checkClientTrusted(X509Certificate[] chain, String authType) throws CertificateException {
//校验客户端证书
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType) throws CertificateException {
//校验服务端证书
X509Certificate ca = (X509Certificate) CertificateFactory.getInstance("X.509")
.generateCertificate(new ByteArrayInputStream(PUB_KEY.getBytes()));
for (X509Certificate cert : chain) {
// 检查服务端证书是否过期
cert.checkValidity();
try {
//和APP预埋证书对比
cert.verify(ca.getPublicKey());
} catch (Exception e) {
//证书校验异常
throw new SecurityException("证书错误!");
}
}
}

@Override
public X509Certificate[] getAcceptedIssuers() {
return new X509Certificate[0];
}
};复制代码

注意证书校验异常时抛出一个SecurityException,如果不抛出这个RuntimeException,程序会继续执行,请求依然正常,证书校验就没有意义。

设置OkHttpClient校验证书

然后使用上面的trustManager构建OkHttpClient

SSLSocketFactory sslSocketFactory = null;
try {
SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(null, new TrustManager[]{trustManager}, new SecureRandom());
sslSocketFactory = sslContext.getSocketFactory();
} catch (NoSuchAlgorithmException | KeyManagementException e) {
e.printStackTrace();
}
final HostnameVerifier hostnameVerifier = new HostnameVerifier() {
@Override
public boolean verify(final String hostname, final SSLSession session) {
//服务端主机域名地址校验
return true;
}
};
OkHttpClient client = new OkHttpClient.Builder()
.hostnameVerifier(hostnameVerifier)
.sslSocketFactory(sslSocketFactory, trustManager)
.build();复制代码

使用这个配置好的OkHttpClient与服务端交互,就可以支持自定义https证书加密通信了,如果服务端证书不符,请求会自动断开。

扫一扫关注我的微信公众号
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/108148.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • Bootstrap File Input,最好用的文件上传组件

    Bootstrap File Input,最好用的文件上传组件本篇介绍如何使用bootstrapfileinput.js(最好用的文件上传组件)来进行图片的展示,上传,包括springMVC后端文件保存。

  • 菜鸟也疯狂,易语言自绘控件__进度条、滑块条[通俗易懂]

    菜鸟也疯狂,易语言自绘控件__进度条、滑块条[通俗易懂]进度条的自绘,关键的是用GetWindowLong得到一个进度条的结构:.版本2.数据类型进度条结构   .成员hWnd,整数型,,,进度条窗口句柄   .成员dwStyle,整数型,,,进度条窗口样式   .成员iMin,整数型,,,最小最大进度   .成员iMax,整数型,,,当前进度值

  • 搜索优化_百度搜索关键词

    搜索优化_百度搜索关键词一个网站其实很简单,但难的是在于那些搜索引擎如(google,yahoo,msn等)如何找到你,并提高排名!最近,我总结了7条最新、最重要的注意事项1.网站优化是为了访问者,而不是针对搜索引擎。  这一点是做网站的终极目标,请牢记这一点。搜索引擎优化要考虑用户体验,用户体验这个东西最重要的了,我们做站就是为了客户所以用户体验是非常重要是第一位的。其次在用户体验的基础之上很好地进行搜

    2022年10月25日
  • Hadoop基础_hadoop教程

    Hadoop基础_hadoop教程Hadoop基础

  • 在乌镇拼命“洗白”的拼多多

    在乌镇拼命“洗白”的拼多多“虽然我们没为别人拼过命,但是一定为别人拼过多多。“以往冬初的乌镇世界互联网大会,刘强东往往会穿着显腰瘦的西服出现,不过今年没出现,倒是友商拼多多的创始人黄峥,来了。黄峥…

  • mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集

    mask rcnn训练自己的数据集_fasterrcnn训练自己的数据集这篇博客是基于GoogleColab的maskrcnn训练自己的数据集(以实例分割为例)文章中数据集的制作这部分的一些补充温馨提示:实例分割是针对同一个类别的不同个体或者不同部分之间进行区分我的任务是对同一个类别的不同个体进行区分,在标注的时候,不同的个体需要设置不同的标签名称在进行标注的时候不要勾选labelme界面左上角File下拉菜单中的StayWithImagesData选项否则生成的json会包含Imagedata信息(是很长的一大串加密的软链接

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号