Kotlin与HTTPS实战

让TomCat打开HTTPS

1、打开Tomcat的网站

http://tomcat.apache.org/tomcat-8.0-doc/ssl-howto.html

在网页中搜索server.xml,找到这段代码

截屏2020-12-03 下午10.30.36

然后复制 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 有效期

截屏2020-12-04 下午2.27.40

android SDK里面

通过命令行生成keystory

keytool -genkeypair -alias alipay -keyalg RSA -validity 3650 -keystore alipay.keystore

然后输入两次密码 ,输入名字和姓氏

截屏2020-12-04 下午8.15.59

把生成的keystory复制到Tomcat的conf目录下

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-2do1lW4s-1651135672105)(https://i.loli.net/2020/12/04/IBSGJ5qkw4ysKzp.png)]

并且修改conf的server.com添加进keystory文件路径

输入文件名和密码

文件名要有子目录

密码是自己设置的密码

截屏2020-12-04 下午8.33.21

重新启动服务器

并且把访问链接改成https开头。并且端口 为8443

https://localhost:8443/alipay.json

通过keystory导出证书

截屏2020-12-05 下午1.09.06

keytool -exportcert -alias alipay -file alipay.cer -keystore alipay.keystore 

然后输入密码123456 就会生成 alipay.cer的证书文件

截屏2020-12-05 下午1.12.53

APP请求Https链接

首先要解决访问https网站错误的问题

javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: Trust anchor for certification path not found.

1、把证书复制到main文件夹下的assets资产目录下

截屏2020-12-05 下午1.15.06

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:

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

朱良浩

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值