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证书加密通信了,如果服务端证书不符,请求会自动断开。

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

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

(0)
上一篇 2022年3月7日 上午9:00
下一篇 2022年3月7日 上午9:00


相关推荐

  • python 中 打印输出 换行

    中间添加print(”)即可#对字典遍历a=[‘banana’,’apple’,’mango’]forbina:print(b)print(”)#range函数循环次数默认在0开始foriinrange(5):

    2022年4月9日
    39
  • 分布式爬虫架构_分布式爬虫工具有哪些

    分布式爬虫架构_分布式爬虫工具有哪些目录分布式爬虫框架消息队列Redis和Scrapy-Redis分布式爬虫框架分布式爬虫框架分为两种:控制模式(左)和自由模式(右):控制模式中的控制节点是系统实现中的瓶颈,自由模式则面临爬行节点之间的通信处理问题。因此,在实际工程中,我们通常使用混合模式:各个爬行节点有各自的功能(爬取的对象不同),它们都注册到一个服务节点上,服务节点能分辨各个爬行节点的分工,用户的请求存放在队列中,处理不同请求的程序从队列中取出请求,然后询问服务节点,由服务节点分配爬行节点给请求的处理程序。下面介绍分布式爬

    2025年7月4日
    3
  • 服务

    服务

    2026年3月13日
    3
  • 普通正态分布如何转换到标准正态分布中_正态分布化成标准正态的公式

    普通正态分布如何转换到标准正态分布中_正态分布化成标准正态的公式1.普通正态分布转换标准正态分布公式我们知道正态分布是由两个参数μ\muμ与σ\sigmaσ确定的。对于任意一个服从N(μ,σ2)N(\mu,\sigma^2)N(μ,σ2)分布的随机变量XXX,经过下面的变换以后都可以转化为μ=0,σ=1\mu=0,\sigma=1μ=0,σ=1的标准正态分布(standardnormaldistribution)。转换公式为:z=X−μσz=\…

    2026年2月6日
    4
  • python中sqrt函数用法_sqrt是什么函数[通俗易懂]

    python中sqrt函数用法_sqrt是什么函数[通俗易懂]sqrt是什么函数?sqrt()是用于计算数字x的平方根的函数。语法以下是sqrt()方法的语法:importmathmath.sqrt(x)注意:sqrt()是不能直接访问的,需要导入math模块,通过静态对象调用该方法。参数x–数值表达式。返回值返回数字x的平方根。实例以下展示了使用sqrt()方法的实例:#!/usr/bin/pythonimportmath#…

    2022年5月4日
    164
  • 超强半监督学习 MixMatch

    超强半监督学习 MixMatch人类的学习方法是半监督学习 他们能从大量的未标记数据和极少量的标记数据学习 迅速理解这个世界 半监督学习最近有没有什么大的突破呢 我的 Twitter 账号被这篇 TheQuietSemi SupervisedRe 1 博客刷屏了 这篇博客介绍了 DeepMind 的 MixMatch 2 方法 此方法仅用少量的标记数据 就使半监督学习的预测精度逼近监督学习 深度学习领域的未来可能因此而刷新 以前的半监督学习方案 一直以来表现其实都很差 你可能会想到 BERT 和 GPT 这两个

    2026年3月17日
    1

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

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