之前我在本站有博客文章,详细说明了,如何使用 OpenSSL 程序自己签发证书,用于基于 Indy 的 WebBroker 或者 WebService 程序,然后使用浏览器或者 Delphi 开发的 WebService 客户端去访问,是没问题的。
但是,浏览器还是会提示,这个证书不可信。即便把这个证书,加入到客户端的 WINDOWS 的证书管理里面,也不行。(备注:网上有文章说,把证书导入到 WINDOWS 里面,浏览器的地址栏就变绿了,不会显示不可信的红色,但是我这里没有成功)。
今天发现,我的 WIN10 电脑上运行 WebService 的客户端去访问自签名证书的服务器没问题,在 WIN7 电脑上反倒不行,跟踪了一下,服务器端(基于 Indy)提示一堆异常,基本上判断是客户端的问题。给客户端电脑(WIN7)导入自己签发的证书,问题没有解决。在客户端电脑使用浏览器去访问,自然也是提示不可信证书,强行让它访问,浏览器倒是可以出现页面。
为了解决这个问题,试了一下腾讯签发的免费证书。
操作:
1. 去腾讯申请免费证书。申请过程很简单,页面入口自己上网一搜就有了;你必须要有一个自己的域名。假设我这里输入的域名是 myDomainName.net.
2. 证书申请成功后,下载证书,是一个 ZIP 文件;
3. 这个 ZIP 包里面有 IIS, APACHE 等目录,里面的文件估计是给对应的 WEB SERVER 使用的,不用管它。我这里是使用 INDY 这个 WEB SERVER;
4. 这个 ZIP 包里面,有 3 个文件:
4.1. myDomainName.net.csr;
4.2. myDomainName.net.key
4.3. myDomainName.net.pem
5. 对于 Indy 来说,它需要3个文件:证书,根证书,以及 key;这里,证书和根证书,都使用 myDomainName.net.pem,不能使用 myDomain.Name.net.csr。
代码如下:
IdServerIOHandlerSSLOpenSSL1.SSLOptions.CertFile := TPath.Combine(Self.GetMyPath, 'MyDomainName.net.pem');
IdServerIOHandlerSSLOpenSSL1.SSLOptions.KeyFile := TPath.Combine(Self.GetMyPath, 'MyDomainName.net.key');
IdServerIOHandlerSSLOpenSSL1.SSLOptions.RootCertFile := TPath.Combine(Self.GetMyPath, 'MyDomainName.net.pem');
6. 这里的 IdServerIOHandlerSSLOpenSSL1 是拖到界面上的控件。这个控件是 Indy 带来用于支持 SSL 的控件。设置它的一些参数,比如上述代码,指定它需要的证书文件等等,然后把它和 Indy 的 WebServer 绑定。绑定的代码:
FServer: TIdHTTPWebBrokerBridge;
FServer.IOHandler := IdServerIOHandlerSSLOpenSSL1;
7. 这个 IdServerIOHandlerSSLOpenSSL1 在设计期,打开属性面板,设置其它属性:
7.1. IdServerIOHandlerSSLOpenSSL1.SSLVersions 里面的各个版本全打勾,只有 sslvSSLv23无法打勾(设计期,无法勾上);
7.2. IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyMode := [];
7.3. IdServerIOHandlerSSLOpenSSL1.SSLOptions.VerifyDepth := 0;
8. 做完上述设置,这个服务器编译运行,就支持 https 访问了。
9. 测试:服务器运行,打开浏览器,地址栏输入 https://127.0.0.1:8080 结果浏览器提示不安全,提示信息是这个证书的域名和当前浏览器访问的域名不同。把 Windows 的 host 文件拿出来,增加一条域名解析:127.0.0.1 myDomainName.net ,然后在浏览器里面使用 https://myDomainName.net:8080 访问,成功,浏览器不再提示不安全,浏览器地址栏也不显示红色了。
10. 做了上述 host 域名解析设置后,使用 Delphi 开发的 WebService 客户端去访问 myDomainName.net 结果阻塞,可能是域名解析不成功导致。直接使用 127.0.0.1 去访问,成功。之前使用自己签发的证书,则使用 127.0.0.1 去访问是不成功的(再次说明:在 WIN10 上是成功的,在 WIN7 上不成功)。
结论:
基于 Indy 开发的 WebServer (比如 WebBroker 程序) 或者 WebService 服务器端程序,加载从腾讯申请的证书,可以让浏览器做 https 访问的时候,成功验证通过。