只要使用自签名证书,必然会遇到这种问题

Posted 泰山李工

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了只要使用自签名证书,必然会遇到这种问题相关的知识,希望对你有一定的参考价值。

前言

有关加解密、https握手连接、域名证书等基础知识,请自我学习了解。介绍大家都会用的工具:

https安全评估工具:https://myssl.com/

https最佳安全实践介绍: https://myssl.com/  首页底部

 1、如何获取数字证书(签名证书)

任何机构或者个人都可以申请数字证书,并使用由CA机构颁发的数字证书为自己的应用保驾护航。


1. 花钱买,从TSP服务商(阿里、腾讯) 购买受信任的签名证书,**根据实际需要,考虑买通配符证书**。

2. 免费的,自签名证书,就是使用openssl、keytool等生成工具,自己生成的证书 。
  + 缺点:**不被client端信任问题**,有些client可以设置Skip TLS Verify忽略证书检查,不能设置的(如浏览器)只能添加信任来解决。
  + 因此,一般用于个人\\企业的内网系统,企业建议使用阿里的免费证书。

3. 免费的,**Let’s Encrypt可以申请免费的证书**,作为一个CA机构得到了很多大公司的支持,它定义了ACME协议,将管理证书的流程进行了标准化。
  + 缺点:证书每三个月会过期,但是可以无限续签;另外生产证书操作步骤真的很麻烦,因此不建议用。

4. 免费的,从服务商(腾讯、阿里)等申请免费的证书,有效期一年

5. 复用的,花钱买通配符证书,我们的内网应用系统就可以使用自定义的二级域名啦。建议是内网用不是外网,**别乱用,外网映射多了,就容易走火,以免对正常业务排查问题带来麻烦**


>备注:常用的两个证书管理工具:KeyTool,OpenSSL—>构建CSR(Certificate Signing Request,数字证书签发申请),交由CA机构签发,形成最终的数字证书,你可以使用CSR在线工具https://www.myssl.cn/tools/create-csr.html

2、使用自签名证书会遇到以下问题

 

TLS/SSL握手过程,我们知道client会验证来自server端的tls证书,使用自签名证书或内部网络路径混乱都会造成client验证证书失败或发生错误。

  • 有些client可以设置Skip TLS Verify忽略证书检查,比如prometheus忽略验证exporter的证书,grafana忽略验证prometheus的证书
  • 有些client不能设置忽略证书检查,比如浏览器不信任自签名证书,如果此服务器仅供您个人内网使用,解决方案是将此证书添加到 浏览器 的受信任证书中。
# cd /tmp
C指定国家、ST指定省份、L指定区、O公司(可以不要),CN域名或者IP(localhost\\127.0.0.1...)
# openssl req -new -newkey rsa:2048 -nodes -x509 -days 3650 -keyout ca.key -out ca.crt \\
-subj "/C=CN/ST=Beijing/L=Beijing/O=MoeloveTest/CN=localhost"在

 

1. 自签名CA证书存在不被(client客户端)浏览器信任问题,解决方法很简单自行“baidu”下,重点介绍下面的问题
2. 上述命令生产的自签名ca证书,client客户端验证来自服务端的证书时,报错:

Q1. failed: x509: cannot validate certificate for 172.22.0.xx because it doesn\'t contain any IP SANs

A1:客户端(grafana)用IP调用或访问服务端时,无法验证172.22.0.xx(prometheus)的证书, 因为它不包含任何IP SAN,怎么办?

   解决方法1:grafana设置忽略对sever端的证书验证

   解决方法2:若不忽略验证证书,则需要给prometheus server生产一个含有“服务端IP”的SANs的证书。

   解决方法3: 客户端etc\\hosts中添加一条DNS解析记录:服务端IP 为IP起的别名,客户端直接用别名调用。

Q2. failed: x509: certificate relies on legacy Common Name field, use SANs instead
A2:查找资料后发现是因为 go 1.15 版本开始废弃 CommonName,推荐使用 SAN 证书。因此,需要将“DNS名称及对应的server主机IP”添加到SAN中来解决此问题 echo subjectAltName = DNS:xxx(别名),IP:server主机ip,IP:127.0.0.1 > extfile.cnf

备注:可联系我获取《生产自签名证书.shell脚本》

3、联系,交流、共同成长

@泰山李工,微信公众号SRE泰山站,了解更多知识。

SDWebImage 加载Https自签名证书时的图片问题

你是否遇到了这种情况,好不容易把自签名HTTPS证书配置好了,访问https接口也成功了,但是图片加载不出来?

传了SDWebImageAllowInvalidSSLCertificates 还是没效果没效果(这种情况只适用于CA我觉得),

并且一直 HTTP load failed (error code: -999 [1:89]),

经过不懈努力,终于找到了在不修改SDWebimageDownloader.m源码的情况下的解决方案;

通过创建SDWebimageDownloader的分类来实现,如下:

.h 文件

1
#import "SDWebImageDownloader.h" 2 3 @interface SDWebImageDownloader (AFNHttps) 4 5 @end

 

 1 #import <SDWebImageDownloader.h>
 2 #import "SDWebImageDownloader+AFNHttps.h"
 3 
 4 @implementation SDWebImageDownloader (AFNHttps)
 5 
 6 + (void)load {
     //设置SDWebImageDownloader的证书
7 [SDWebImageDownloader sharedDownloader].urlCredential = [self myUrlCredential]; 8 } 9 10 + (NSURLCredential *)myUrlCredential { 11 12 NSString *thePath = [[NSBundle mainBundle] pathForResource:@"p12证书名" ofType:@"p12"]; 13 //倒入证书 NSLog(@"thePath===========%@",thePath); 14 NSData *PKCS12Data = [[NSData alloc] initWithContentsOfFile:thePath]; 15 CFDataRef inPKCS12Data = (__bridge CFDataRef)PKCS12Data; 16 17 SecIdentityRef identity = NULL; 18 // extract the ideneity from the certificate 19 [self mosM_extractIdentity:inPKCS12Data toIdentity:&identity]; 20 21 SecCertificateRef certificate = NULL; 22 SecIdentityCopyCertificate (identity, &certificate); 27 28 return [NSURLCredential credentialWithIdentity:identity certificates:nil persistence:NSURLCredentialPersistencePermanent];; 29 } 30 31 32 + (OSStatus)extractIdentity:(CFDataRef)inP12Data toIdentity:(SecIdentityRef*)identity { 33 OSStatus securityError = errSecSuccess; 34 CFStringRef password = CFSTR("p12证书密码"); 35 const void *keys[] = { kSecImportExportPassphrase }; 36 const void *values[] = { password }; 37 CFDictionaryRef options = CFDictionaryCreate(NULL, keys, values, 1, NULL, NULL); 38 CFArrayRef items = CFArrayCreate(NULL, 0, 0, NULL); 39 securityError = SecPKCS12Import(inP12Data, options, &items); 40 if (securityError == 0) 41 { 42 CFDictionaryRef ident = CFArrayGetValueAtIndex(items,0); 43 const void *tempIdentity = NULL; 44 tempIdentity = CFDictionaryGetValue(ident, kSecImportItemIdentity); 45 *identity = (SecIdentityRef)tempIdentity; 46 } 47 if (options) { 48 CFRelease(options); 49 } 50 return securityError; 51 }

 




以上是关于只要使用自签名证书,必然会遇到这种问题的主要内容,如果未能解决你的问题,请参考以下文章

Azure 上的 Certenroll - 生成自签名证书

SDWebImage 加载Https自签名证书时的图片问题

仅将自签名 SSL 证书用于 Web 服务

自签名证书:私钥问题

wget、自签名证书和自定义 HTTPS 服务器

SSL 认证问题 - 使用 Tomcat 的 Spring 和本地自签名证书