制作CSR申请文件
安装证书文件
客户端证书认证
强制HTTPS访问
访问控制举例
证书的备份(导出)
证书的恢复(导入)
通配符和多域名证书在虚拟主机上的部署
Openssl编译简介
制作CSR申请文件
制作Apache下使用的CSR请求文件,最简单的办法就直接使用我们的 OpenSSL CSR在线生成器: https://www.myssl.cn/openssl/createcsr.asp
(注意:您必须同时保存server.key和server.csr文件)
Apache 2.2 SSL主要采用BASE64位的PEM文件格式,可以采用Openssl命令行工具来生成CSR文件,OpenSSL工具是免费的,可以从www.openssl.org下载到最新的源码,但需要自己编译(见Openssl编译简介),你也可以下载使用已经编译好的OpenSSL 0.9.8.a for win32,下载地址是: http://www.myssl.cn/download/OpenSSL_0.9.8.a_Win32.zip
1、Openssl是一个命令行工具,首先将下载包解压到C:\openssl下。
2、打开DOS命令行窗口,进入C:\openssl,输入命令:
openssl req -new -nodes -keyout server.key -out server.csr
Loading 'screen' into random state - done Generating a 1024 bit RSA private key ...........................++++++ ....................................++++++ writing new private key to 'server.key' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN State or Province Name (full name) [Some-State]:Shanghai Locality Name (eg, city) []:Shanghai Organization Name (eg, company) [Internet Widgits Ltd]: Shanghai Fastcom Technology Co.,Ltd. Organizational Unit Name (eg, section) []:IT Dept. Common Name (eg, YOUR name) []:www.myssl.cn Email Address []: Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: An optional company name []:
3、在完成了如上的交互信息输入后,当前目录下将产生两个文件:server.key 和 server.csr。请妥善保存这两个文件,请不要泄露server.key私钥文件。
4、在这一命令执行的过程中,系统会要求您填写如下信息:
Country Name (2 letter code) | 使用国际标准组织(ISO)国码格式,填写2个字母的国家代号。中国请填写CN。 |
State or Province Name (full name) | 省份,比如填写Shanghai |
Locality Name (eg, city) | 城市,比如填写Shanghai |
Organization Name (eg, company) | 组织单位,比如填写公司名称的拼音 |
Organizational Unit Name (eg, section) | 比如填写IT Dept |
Common Name (eg, your websites domain name): | 行使 SSL 加密的网站地址。请注意这里并不是单指您的域名,而是直接使用 SSL 的网站名称 例如:pay.abc.com。 一个网站这里定义是: abc.com 是一个网站; www.abc.com 是另外一个网站; pay.abc.com 又是另外一个网站。 |
Email Address | 邮件地址,可以不填 |
A challenge password | 可以不填 |
An optional company name | 可以不填 |
5、如何产生2048位的密钥对?
在上面的命令行交互中,我们看到“Generating a 1024 bit RSA private key”,即系统缺省采用1024位的RSA密钥长度,一般来说1024位是足够的,但是在申请EV证书的时候,我们必须采用2048位的密钥长度,要生成2048位的密钥,可以修改上面的命令行:(斜体部分为增加的参数)
openssl req -new -nodes -newkey rsa:2048 -keyout server.key -out server.csr
6、如何制作中文的CSR文件?
中文CSR文件,主要指企业名称、部门,城市,省份等信息采用中文,通用名和国家代码仍然必须是英文的,GeoTrust目前已经全面支持中文的CSR,要制作中文的CSR,最简单的办法仍然是采用我们的在线CSR生成器: https://www.myssl.cn/openssl/createcsr.asp
如果希望自己通过Openssl工具来制作中文CSR就需要多费一些工夫了,下面详细介绍一下采用Openssl命令行制作中文CSR的方法。
Openssl本身是可以支持UTF-8编码来支持中文的,但是如果通过DOS命令行是无法输入UTF-8的中文字符的,所以我们必须采用Opnessl.cnf配置文件的缺省值来实现中文字的输入。采用一个文本编辑器,最好是支持utf-8字符的,我采用UltraEdit,打开Openssl.cnf文件,首先修改:
string_mask = utf8only
这句话将强制字符的输入采用UTF-8的编码格式,然后修改缺省DN信息,录入我们需要合中文字符,如下
commonName_default = www.myssl.cn organizationName_default = 上海迅通科技有限公司 organizationalUnitName_default = IT 部门 stateOrProvinceName_default = 上海 localityName_default = 上海 countryName_default = CN
然后将文件按utf-8,no bom的编码格式保存,在Ultraedit下,请选择“另存为”,格式为“UTF-8 - NO-BOM”。如果没有可以支持UTF-8的编辑工具,也可以下载一个ICONV来做编码转换工作。
准备好openss.cnf文件后,输入命令行:
openssl req -utf8 -config config.cnf -new -nodes -batch -keyout server.key -out server.csr
系统将自动生成CSR文件,保存在server.csr中。
CSR已经做好,最后强调,必须同时保存好server.csr和server.key2个文件,尤其是server.key一定丢失,将无法再使用这个证书。
安装证书文件
1、将证书内容存为一个文件:
您会收到一封来自迅通诚信的邮件,证书内容附在邮件中。如果证书是以附件的形式(Cert.cer)夹带在邮件中,您就可以直接应用它。如果您的证书中以文本的方式存在邮件中,您就需要将邮件中的证书部分的内容用Vi或Notepad存成一个纯文本文件。不要将其存成Microsoft Word 或其它字处理软件格式,并确定证书内容中不含有空行和空格,文件名可以为server.cer。如下所示:
将保存好的server.cer文件和制作CSR时候生成的server.key一起复制到服务器上。
2、修改httpd.conf文件。
Apache一般有2个版本下载,一个是带SSL模块的,一个是不带SSL的,请首先检查自己的SSL是包含了SSL模块的,否则就没法做了。Apache的参数配置都在httpd.conf文件中,SSL配置也是如此,此外还可以通过include httpd-ssl.conf来包含一个专门配置SSL的配置文件,如果激活了httpd-include ssl.conf,则可以打开httpd-ssl.conf来配置相应参数。
一般,我们直接在httpd.conf文件中直接配置SSL参数:
#加载模块mod_ssl.so,此模块是启用SSL功能必须的。 LoadModule ssl_module modules/mod_ssl.so #监听443端口 Listen 443 #建立一个SSL的虚拟站点,避免SSL配置影响原来HTTP的站点配置。 <VirtualHost _default_:443> DocumentRoot "C:/Program Files/Apache2/htdocs" ServerName www.myssl.cn:443 SSLEngine on SSLCertificateFile "C:/SSL/server.cer" SSLCertificateKeyFile "C:/SSL/server.key" SSLCertificateChainFile "C:/SSL/chain.cer" ErrorLog "C:/Program Files/Apache2/logs/error.log" TransferLog "C:/Program Files/Apache2/logs/access.log" </VirtualHost> #说明主站是使用HTTP通信的,只有上面虚拟站点有SSL SSLEngine off
配置参数说明如下(完整的SSL配置参数见这里):
Listen 443:
SSL协议监听的端口,同下面Virtualhost 中的端口需要匹配,SSL协议缺省使用443端口,也有使用8443的情况。
SSLEngine on:
SSL功能打开,如果在Virtualhost出现这句,则仅作用于虚拟机站点配置范围,这个虚拟机站点全部使用SSL通信,如果出现在Virtualhost外,则作用于全局,整个服务器都使用SSL(HTTPS)通信,不能采用HTTP通信,所以通常都在Virtualhost中加这句。
SSLCertificateFile:
证书文件,server.cer
SSLCertificateKeyFile
私钥文件,server.key
SSLCertificateChainFile
中间链证书,请根据产品下载中间链证书,并保存为'chain.cer'
全球信SSL专业版证书
(QuickSSL Premium)
全球信SSL企业版证书
(True BusinessID)
全球信SSL企业版多域名证书
(True BusinessID Multidomain)
全球信SSL企业版通配符证书
(True BusinessID Wildcard)
全球信SSL至尊版证书
(True BusinessID EV)
闪快SSL普及版新
(RadidSSL),2014年12月以后申请的证书
闪快SSL普及版
(RadidSSL),2014年12月以前申请的证书
Errorlog,TranksferLog:
日志文件
SSLEngine off:
整个站点,除了虚拟站点外,关闭SSL,仍然支持HTTP通信。
3、重新启动Apache,如果是在Linux下,输入:
apachectl stop
apachectl startssl
客户端证书认证
1、基本客户证书认证
强制客户对整个站点都必须采用客户证书认证的方式,可以在原来的配置下增加如下参数:
<VirtualHost _default_:443> ...... ...... ...... # 需要客户有一个客户端证书,并由ca.cer这个CA证书签署 SSLVerifyClient require SSLVerifyDepth 1 SSLCACertificateFile conf/ssl.crt/ca.cer </VirtualHost>
2、如果只要求对特定目录采用客户证书认证方式,其他目录都不需要客户端证书,则可以采用如下配置:
<VirtualHost _default_:443> ...... ...... ...... # 需要客户有一个客户端证书,并由ca.cer这个CA证书签署 SSLVerifyClient none SSLCACertificateFile conf/ssl.crt/ca.crt <Location /secure/area> SSLVerifyClient require SSLVerifyDepth 1 </Location> </VirtualHost>
强制HTTPS访问
强制HTTPS访问,主要通过将用户访问的HTTP请求自动转换为HTTPS请求,有两种方式:一种是通过编程的方式,详见:"强制用户通过SSL访问网站" ;另一种方式则是通过Apache强大的Rewrite功能。
如果要针对整个网站全部执行HTTP自动转为HTTPS的功能,可以在httpd.conf文件中,增加:
RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R]
如果,仅要求对\secure目录下的内容强制采用HTTPS访问,可以在httpd.conf文件中加入如下语句:
<Directory "C:\Program Files\htdocs\secure"> RewriteEngine on RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}/secure/$1 [L,R] </Directory>
访问控制举例
如何对来自Internet并要访问Intranet的客户强制采用强加密的HTTPS通信,并采用基本或者客户证书的认证方式?同时还要确保来自Intranet的客户可以进行HTTP访问?
假设IntranetIP地址段是192.160.1.0/24,Intranet站点子区域的URL是/subarea ,则可以在HTTPS虚拟主机站点以外增加如下配置(这样可以同时作用于HTTPS和HTTP):
SSLCACertificateFile conf/ssl.crt/company-ca.crt <Directory /usr/local/apache2/htdocs> # subarea以外的区域只允许来自Intranet的访问 Order deny,allow Deny from all Allow from 192.168.1.0/24 </Directory> <Directory /usr/local/apache2/htdocs/subarea> # 在subarea以内,允许所有来自Intranet的访问, # 但对来自Internet的访问,仅允许HTTPS+Strong-Cipher+Password # 或者HTTPS+Strong-Cipher+Client-Certificate # 如果使用了HTTPS,则确保使用高强度加密 # 同时允许客户以基本认证的形式认证 SSLVerifyClient optional SSLVerifyDepth 1 SSLOptions +FakeBasicAuth +StrictRequire SSLRequire %{SSL_CIPHER_USEKEYSIZE} >= 128 # 强制来自Internet的客户使用HTTPS RewriteEngine on RewriteCond %{REMOTE_ADDR} !^192\.168\.1\.[0-9]+$ RewriteCond %{HTTPS} !=on RewriteRule ^(.*) https://%{SERVER_NAME}$1 [L,R] # 允许网络访问和基本认证 Satisfy any # 控制网络访问 Order deny,allow Deny from all Allow 192.168.1.0/24 # HTTP基本认证 AuthType basic AuthName "Protected Intranet Area" AuthBasicProvider file AuthUserFile conf/protected.passwd Require valid-user </Directory>
证书的备份(导出)
在Apache下的证书备份是非常简单的,打开httpd.conf文件,找到SSLCertificateFile和SSLCertificateKeyFile指定的2个文件,通常是.cer(.crt)和.key文件,将这两个文件复制到备份媒质上即可。
证书的恢复(导入)
要恢复Apache的证书同样非常简单,将备份的.cer和.key文件,复制到新的服务器上,然后参考上面服务器证书安装说明,修改httpd.conf文件即可。
通配符和多域名证书在虚拟主机上的部署
如果要在一个IP地址上部署多个SSL网站,一种办法就是给每个网站分配不同的端口号,但这给用户使用带来很多麻烦。如果要在同一个IP地址的443端口上部署多个SSL网站,必须保证这些网站的域名都能匹配相同的一张SSL证书。这是因为SSL握手过程是通过IP+Port来进行通信,一个IP的443端口只能返给客户一张SSL证书(即使配置了多张证书,也只能返回第一张,因为用户请求信息中,只有看到IP地址,无法区分用户需要哪个证书),如果这张证书能够满足这些网站的主机名匹配要求,就可以使用。
一般能匹配多个主机名的证书有通配符证书*.domain.com和多域名证书(www.domain.com,ftp.domain.com等),以下我们提供一个典型同一个IP上的多主机名部署配置,www.domain.com对应的根目录在WWW下,ftp.domain.com对应的根目录在FTP下
NameVirtualHost 11.22.33.44:443 <VirtualHost 11.22.33.44:443> DocumentRoot "C:/Apache2.2/htdocs/www" ServerName www.domain.com SSLEngine on SSLCertificateFile "C:/Apache2.2/conf/server.cer" SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" SSLCertificateChainFile "C:/Apache2.2/conf/chain.cer" </VirtualHost> <VirtualHost 11.22.33.44:443> DocumentRoot "C:/Apache2.2/htdocs/ftp" ServerName ftp.domain.com SSLEngine on SSLCertificateFile "C:/Apache2.2/conf/server.cer" SSLCertificateKeyFile "C:/Apache2.2/conf/server.key" </VirtualHost>
Openssl编译简介
1、Openssl是开源的,可以到http://www.openssl.org/source/下载最新的版本。然后解压到c:\openssl。
2、要编译Openssl,需要下载并安装ActivePerl,并在系统路径中添加“C:\Perl\site\bin;C:\Perl\bin”
3、安装Vs2003(也可以安装VS2005,2008但这2个版本的VC编译出来的Openssl是有BUG的,在特定情况下会产生win32异常错误,仅适合偶尔用一下的情况)。
4、使用VS2003下的Visual Studio.net 2003 Command Prompt进入控制台模式(这个模式会自动设置各种环境变量)
5、进入c:\openssl。
6、输入(注意大小写): perl Configure VC-WIN32
7、输入: ms\do_ms
8、输入: nmake -f ms\ntdll.mak
9、Openssl已经编译好了,执行程序在out32dll目录下。