配置:
  • 可以使用同一个服务器同时提供HTTP和HTTPS服务吗?
         当然可以!HTTP和HTTPS使用的是不同的服务端口(HTTP位于80端口,而HTTPS位于443端口),所以它们之间并没有什么直接的冲突。你既可以在这两个端口上分别运行两个Apache实例,也可以在同一个Apache实例上配置两个虚拟主机:一个在80端口应答HTTP请求,另一个在443端口应答HTTPS请求。
     
     
  • HTTPS究竟使用的是什么端口?
         事实上,你可以在任何端口运行HTTPS服务,但是默认的标准端口是443。443端口也是浏览器默认连接的HTTPS端口。当然,你也可以在URL中强制浏览器使用非默认的端口,比如使用666端口的话,你可以这样:https://secure.willrey.com:666/
     
     
  • 为什么我在启动Apache时会收到与SSLMutex相关的权限错误?
         诸如"mod_ssl: Child could not open SSLMutex lockfile /opt/apache/logs/ssl_mutex.18332 (System error follows) [...] System: Permission denied (errno: 13)"这样的错误通常是由于对目录的权限限制过分苛刻所致。请确保Apache子进程的UID对所有父目录(本例中是/opt,/opt/apache,/opt/apache/logs)都具有执行权限
 
证书:
  • 什么是RSA私钥(RSA Private Key)、CSR(证书签发请求)、证书(Certificates)?  

RSA私钥(RSA Private Key)文件是一个数字文件,它用于解密你所接收到的信息。此私钥有一个对应的、被封装在你发布出去的证书文件中的公钥,而给你发送信息的人正是用这个公钥对发送的信息进行加密的。

一个证书签发请求(CSR,Certificate Signing Request)是一个数字文件,它包含了你的公钥和你的名字。你把这个CSR发送给认证中心(CA)后,CA将会对其进行签名(译者注:使用CA自己的私钥对你的公钥和名字进行加密),并将其转化为一个真正的证书。

证书(Certificate)包含了你的RSA公钥、你的名字、CA的名字,并且经过了CA的数字签名。能够识别这个CA的浏览器可以校验这个证书上的签名,从而就可以获取你的RSA公钥。这样浏览器就可以发送只有你能够解密的信息。


   
  • 配置了SSL支持的Apache和普通的Apache在启动时有什么不同吗?
        

    一般说来没什么不同,但是如果你使用的SSL私钥文件带有密码(passphrase)保护,那么Apache将会在启动时要求你输入密码。

    必须在Apache启动时输入密语可能会造成一些麻烦:比如你无法在系统的启动脚本中启动Apache服务。当然,你也可以使用下面的办法去除私钥文件上的密码。

首先备份原始RSA私钥文件,然后再去除RSA私钥文件上的密语保护:
$ cp server.key server.key.org
$ openssl rsa -in server.key.org -out server.key
 

确保server.key只能被root读取:
$ chmod 400 server.key

现在,server.key中就包含了一份未加密的私钥。如果你让Apache使用这个文件,那么就不会在启动的时候提示输入密码了。但是如果有任何其他人获得了这个未加密的私钥文件,那么他就可以冒充你的身份。所以你必须确保只有root用户可以读取它,然后以root启动Apache并以其他用户身份运行Apache的子进程。

另一种选择是使用"SSLPassPhraseDialog exec:/path/to/program"功能,但是需要切记的是这种做法并不能获得更高的安全性(当然也不更低)。
 

  • 如何验证一个私钥文件是否与一个证书相匹配?

    每个私钥文件都包含一连串数字,其中有两串数字来源于对应的公钥。当你生成CSR的时候,这两串数字将被包含在其中。自然,当CSR被签署成证书后,这两串数字仍然被包含在证书中。

    因此要验证一个私钥文件是否与一个证书相匹配,只要检查证书中的这两串数字是否与私钥中的相同即可。可以使用下面这两个命令查看:

    $ openssl x509 -noout -text -in server.crt
    $ openssl rsa -noout -text -in server.key

    私钥和证书输出的"modulus"和"public exponent"两个部分必须互相匹配。"public exponent"的值通常都是"65537",但是"modulus"的值却是一串很长很长数字,检查起来非常吃力。所以,你也可以使用下面的命令,通过检查其MD5值是否一致来判断:

    $ openssl x509 -noout -modulus -in server.crt | openssl md5
    $ openssl rsa -noout -modulus -in server.key | openssl md5

    这个方法允许你通过比较两串较短的MD5值来判断两个较长的"modulus"值是否相等。理论上,可能会出现两个"modulus"值不等,但MD5值相等的可能。但在实践中,这种可能性基本为零。

    如果你想检查一个CSR与一个私钥或证书是否匹配,也可以用相同的办法:

    $ openssl req -noout -modulus -in server.csr | openssl md5
     

  • 为什么我的2048位私钥不能正常使用?
    为了兼容某些特别的浏览器,建议你只使用1024位RSA密钥,否则这些浏览器将不能正常工作。[译者注]:IE只到8.0才真正支持大于1024位RSA密钥,但Firefox2/Opera9甚至可以支持到4096位(也许更长)的RSA密钥。

     
  • 为什么在将SSLeay从0.8版本升级到0.9之后客户端认证会失败?
    放在SSLCACertificatePath指令目录下的CA证书会被SSLeay通过"openssl x509 -noout -hash"命令得到的哈希值进行索引。但是SSLeay 0.8与0.9版本之间的哈希算法并不相同,因此你必须在升级之后使用mod_ssl提供的Makefile更新哈希值。

     
  • 如何将PEM格式的证书转换成DER格式?
    SSLeay/OpenSSL默认的证书格式是PEM,它是经过Base64编码的DER再加上页眉页脚线组成的。而某些应用程序(比如Microsoft Internet Explorer)却只能识别原始的DER格式。你可以使用下面的命令将PEM格式的cert.pem证书转换成DER格式的cert.der证书:
    $ openssl x509 -in cert.pem -out cert.der -outform DER

     
  • mod_ssl可以配合SGC(Server Gated Cryptography)技术(也就是Verisign Global ID)一起使用吗?
    当然可以!mod_ssl从2.1版本起就支持SGC技术了,并且不需要任何特殊的配置——只要使用Global ID作为你的服务器证书即可。客户端浏览器的提升工作会由mod_ssl在运行时自动处理。

Keytool 是一个JAVA环境下的安全钥匙与证书的管理工具.它管理一个存储了私有钥匙和验证相应公共钥匙的与它们相关联的X.509 证书链的keystore(相当一个数据库,里面可存放多个X.509标准的证书).


 

Keytool 常用命令:

  • 检查一个keystore

    keytool -list -v -keystore c:\server.jks
 
  • 检查一个keystore的内容

    keytool -list -v -keystore c:\server.jks
 
  • 添加一个信任根证书到keystore文件

    keytool -import -alias newroot -file root.cer -keystore server.jks

     
  • 导入CA签署好的证书

    keytool -import -keystore c:\server.jks -alias tomcat -file c:\cert.txt

     
  • 从 KEYSTORE中导出一个证书文件

    keytool -export -alias myssl -keystore server.jks -rfc -file server.cer
    *备注: "-rfc" 表示以base64输出文件,否则以二进制输出。

     
  • 从KEYSTORE中删除一个证书

    keytool -delete -keystore server.jks -alias tomcat
    *备注:删除了别名为tomcat的证书。