让TomCat打开HTTPS
1、打开Tomcat的网站
http://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html
在网页中搜索server.xml,找到这段代码
然后复制 keystory开头的哪一行的两个属性
keystoreFile="${user.home}/.keystore" keystorePass="changeit"
打开Tomcat的conf文件夹中的server.xml
搜索 8009 关键字,
把8009的注释取消掉
<!--
<Connector protocol="AJP/1.3"
address="::1"
port="8009"
redirectPort="8443" />
-->
并且在下面添加一个标签
<Connector port="8443" protocol="org.apache.coyote.http11.Http11NioProtocol"
maxThreads="150" SSLEnabled="true" scheme="https" secure="true"
clientAuth="false" sslProtocol="TLS"
keystoreFile="G:/software/apache-tomcat-8.0.43-x64/xxx.keystore" keystorePass="xxxx"
/>
重启Tomcat 并且把访问的接口改成 8843
配置Keystory文件
-
-certreq 生成证书请求
-
-changealias 更改条目的别名
-
-delete 删除条目
-
-exportcert 导出证书
-
-genkeypair 生成密钥对
-
-genseckey 生成密钥
-
-gencert 根据证书请求生成证书
-
-importcert 导入证书或证书链
-
-importpass 导入口令
-
-importkeystore 从其他密钥库导入一个或所有条目
-
-keypasswd 更改条目的密钥口令
-
-list 列出密钥库中的条目
-
-printcert 打印证书内容
-
-printcertreq 打印证书请求的内容
-
-printcrl 打印 CRL 文件的内容
-
-storepasswd 更改密钥库的存储口令
-
-showinfo 显示安全相关信息
-
-keyalg 加密方式 (参数可以使RSA)
-
-validity 有效期
android SDK里面
通过命令行生成keystory
keytool -genkeypair -alias alipay -keyalg RSA -validity 3650 -keystore alipay.keystore
然后输入两次密码 ,输入名字和姓氏
把生成的keystory复制到Tomcat的conf目录下
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2do1lW4s-1651135672105)(https://i.loli.net/2020/12/04/IBSGJ5qkw4ysKzp.png)]
并且修改conf的server.com添加进keystory文件路径
输入文件名和密码
文件名要有子目录
密码是自己设置的密码
重新启动服务器
并且把访问链接改成https开头。并且端口 为8443
https://localhost:8443/alipay.json
通过keystory导出证书
keytool -exportcert -alias alipay -file alipay.cer -keystore alipay.keystore
然后输入密码123456 就会生成 alipay.cer的证书文件
APP请求Https链接
首先要解决访问https网站错误的问题
javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.
1、把证书复制到main文件夹下的assets资产目录下
class MainActivity : AppCompatActivity() {
val btnPay by lazy {
btn_pay
}
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
btnPay.onClick {
sendHttps()
}
}
var sendHttps = {
doAsync {
//1.创建SSL上下文对象设置信任管理器
val sslContext = SSLContext.getInstance("TLS") //TLS是tomcat里面service.xml配置的类型
//2.获取信任管理器的工厂
val tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm())
//3.创建ketstory
val ks = KeyStore.getInstance(KeyStore.getDefaultType())
//3.1清空默认证书
ks.load(null)
//3.2设置自己的证书
val cf = CertificateFactory.getInstance("X.509")// 参数是二进制的一次
val open = assets.open("alipay.cer")
val cert = cf.generateCertificate(open)
ks.setCertificateEntry("alipay", cert)
//4.信任管理器的工厂初始化
tmf.init(ks)
//5.创建信任管理器
val tm = tmf.trustManagers
//6.初始化信任管理器
sslContext.init(null, tm, null)
val url = URL("https://192.168.2.189:8443/alipay.json")
var connectionHttps: HttpsURLConnection = url.openConnection() as HttpsURLConnection
//7.使用信任管理器
connectionHttps.sslSocketFactory = sslContext.socketFactory
//8.校验主机名
connectionHttps.hostnameVerifier = MyHostnameVerifier()
//获取服务器返回的流
val ins = connectionHttps.inputStream
//转成字符串
val bos = ByteArrayOutputStream()
//定义一个缓冲器
var buffer = ByteArray(1024)
var len = 0
len = ins.read(buffer)
while (len != -1) {
bos.write(buffer, 0, len)
len = ins.read(buffer)
}
val result = bos.toString()
println(result)
}
}
/**
* 实现校验主机名的类
*/
private class MyHostnameVerifier : HostnameVerifier {
//当发现是自己的或公司的接口,返回true
override fun verify(p0: String?, p1: SSLSession?): Boolean {
//TODO 校验逻辑
return true
}
}
}
端口地址不能被校验
javax.net.ssl.SSLPeerUnverifiedException: Hostname 192.168.2.189 not verified: