美文网首页iOS工程实践https数字证书(信息安全)
TomCat自建证书,iOS HTTPS连接使用并解决AFNet

TomCat自建证书,iOS HTTPS连接使用并解决AFNet

作者: 笨鸟不飞飞 | 来源:发表于2016-12-14 16:37 被阅读1429次

    马上要到17年1月1日了,苹果要求使用HTTPS协议,很多第三方SDK都已经适配了,这里我先提前备好


    为服务器生成证书

     '生成服务器证书'
    keytool -genkey -v -alias tomcat -keyalg RSA -keystore server.keystore -validity 36500
     '生成客户端证书'
    keytool -genkey -v -alias mykey -keyalg RSA -storetype PKCS12 -keystore client.p12 -validity 36500
     '生成客户端p12证书信任文件'
    keytool -export -alias mykey -keystore client.p12 -storetype PKCS12 -storepass 密码 -rfc -file client.cer
     '导入到服务端keystore中'
    keytool -import -v -file client.cer -keystore server.keystore
    '把服务器证书导出为CER文件'
    keytool -keystore D:\home\tomcat.keystore -export -alias tomcat -file D:\home\tomcat.cer (tomcat为你设置服务器端的证书名,路径换成自己的路径)
    

    TomCat 的conf文件夹下
    修改 server.xml文件

    <Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true"  
               maxThreads="150" scheme="https" secure="true"  
               clientAuth="false" sslProtocol="TLS"  
               keystoreFile="D:\\tomcat.keystore" keystorePass="密码"  
               truststoreFile="D:\\tomcat.keystore" truststorePass="密码" /> 
    

    注意服务端证书名保持一致属性说明:
    clientAuth:设置是否双向验证,默认为false,设置为true代表双向验证
    keystoreFile:服务器证书文件路径
    keystorePass:服务器证书密码
    truststoreFile:用来验证客户端证书的根证书,此例中就是服务器证书
    truststorePass:根证书密码


    单向验证
    clientAuth:设置false
    双向验证
    clientAuth设置true. 那么客户端必须要有 client.p12文件才能访问tomcat服务器,
    还需要在客户端安装服务器证书,双击“tomcat.cer”,按照提示安装证书,将证书填入到“受信任的根证书颁发机构”。


    iOS单向验证
    证书用tomcat.cer

        //先导入证书,找到证书的路径
        NSString *cerPath = [[NSBundle mainBundle] pathForResource:@"证书名" ofType:@"cer"];
        NSData *cerData = [NSData dataWithContentsOfFile:cerPath];
        //AFSSLPinningModeCertificate 使用证书验证模式
        AFSecurityPolicy *securityPolicy = [AFSecurityPolicy policyWithPinningMode:AFSSLPinningModeCertificate];
        //allowInvalidCertificates 是否允许无效证书(也就是自建的证书),默认为NO
        //如果是需要验证自建证书,需要设置为YES
        securityPolicy.allowInvalidCertificates = YES;
        //validatesDomainName 是否需要验证域名,默认为YES;
        //假如证书的域名与你请求的域名不一致,需把该项设置为NO;如设成NO的话,即服务器使用其他可信任机构颁发的证书,也可以建立连接,这个非常危险,建议打开。
        //置为NO,主要用于这种情况:客户端请求的是子域名,而证书上的是另外一个域名。因为SSL证书上的域名是独立的,假如证书上注册的域名是www.google.com,那么mail.google.com是无法验证通过的;当然,有钱可以注册通配符的域名*.google.com,但这个还是比较贵的。
        //如置为NO,建议自己添加对应域名的校验逻辑。
        securityPolicy.validatesDomainName = NO;
        NSSet *set = [[NSSet alloc] initWithObjects:cerData, nil];
        securityPolicy.pinnedCertificates = set;
    
    //在AFN设置上securityPolicy
       AFHTTPSessionManager *manager = [AFHTTPSessionManager manager];
       manager.securityPolicy = securityPolicy;
    

    双向认证
    请移步下面链接,不清楚苹果到时候让不让单向认证,目前只使用了单向认证,如果不让请留言提示下我
    http://www.jianshu.com/p/9e573607be13

    解决SecCertificateCreateWithData崩溃
    有些人直接用后台给的证书会出现SecCertificateCreateWithData崩溃,这是因为证书的问题,证书多加密了一层BASE64加密,


    两种证书的不同
    右键用文本编辑软件打开就能看到

    屏幕快照 2017-01-16 下午3.33.11.png 屏幕快照 2017-01-16 下午3.33.34.png

    解决方式
    第一种方法:把证书里面的字符串复制出来,然后解BASE64后再转Data。
    第二种方法:用mac系统的字符串工具把证书导入进来,然后再导出成cer,这个cer就可以直接使用
    方法一相对于方法二更安全些,证书文件不会在包里出现
    第一种方法
    把需要处理的证书里面的文字,全部拷到项目里

    屏幕快照 2017-01-16 下午3.37.28.png

    需要注意的是把下面这两行去掉,只留中间的字符串

    -----BEGIN CERTIFICATE-----
    -----END CERTIFICATE-----
    

    解BASE64编码

    NSData *cerData = [[NSData alloc] initWithBase64EncodedString:httpsKEY options:0];
    

    然后按单向认证中的方法直接使用Data就行了


    第二种方法

    屏幕快照 2016-12-14 下午4.31.49.png 屏幕快照 2016-12-14 下午4.32.18.png 屏幕快照 2016-12-14 下午4.32.28.png

    如果解决了你的问题,希望给个喜欢
    如果我写的有什么问题,欢迎留言指出


    TomCat自建证书参考
    http://www.jianshu.com/p/2a7fbda9de5b
    http://blog.csdn.net/xxd851116/article/details/18701731

    相关文章

      网友评论

        本文标题:TomCat自建证书,iOS HTTPS连接使用并解决AFNet

        本文链接:https://www.haomeiwen.com/subject/exwimttx.html