zoukankan      html  css  js  c++  java
  • Linux下Apache https认证

    参考:http://kyfxbl.iteye.com/blog/1910891 http://showerlee.blog.51cto.com/2047005/1266712

    一、环境
    httpd:Apache2.4.10
    openssl:1.0.1
    OS:CentOS5.7

    四、在httpd中配置单向HTTPS
    1、编辑 httpd.conf,分别查找下面2行代码,并去掉前面的#,(这里的前提是,在编译httpd的时候,已经编译了ssl模块)

    vim /usr/local/apache/conf/httpd.conf
    LoadModule socache_shmcb_module modules/mod_socache_shmcb.so  
    LoadModule socache_dbm_module modules/mod_socache_dbm.so  
    LoadModule socache_memcache_module modules/mod_socache_memcache.so  
    LoadModule ssl_module modules/mod_ssl.so
    		
    Include conf/extra/httpd-ssl.conf 
    		
    <IfModule ssl_module>  
    	SSLRandomSeed startup builtin  
    	SSLRandomSeed connect builtin  
    </IfModule> 
    

    2、vim /usr/local/apache/conf/extra/httpd-ssl.conf 

    SSLEngine on  
    SSLCertificateFile "/usr/local/httpd/conf/server.cer"  
    SSLCertificateKeyFile "/usr/local/httpd/conf/server.key.pem" 
    #SSLCACertificateFile "/usr/local/httpd/conf/ca.cer" #SSLVerifyClient require #SSLVerifyDepth 10

    只要开启前3个,单向的HTTPS认证就配置好了。后面3个目前先注释掉,是后面双向认证才用到,然后重启一下httpd,会发现报错:

    AH00526: Syntax error on line 106 of /usr/local/httpd/conf/extra/httpd-ssl.conf:
    SSLCertificateFile: file '/usr/local/httpd/conf/server.cer' does not exist or is empty

    这是因为httpd需要一个服务端的私钥(.key.pem),和一个服务端证书(.cer)。前面已经配置了这2个文件的路径,但是还没有创建。下一步就要创建这些文件

    五、创建CA(Certificate Authority)
    1、准备工作
    在/usr/local/下创建以下几个子目录: /private ,/certificates

    2、创建CA私钥

    openssl genrsa -aes256 -out private/ca.key.pem 2048
    输入密码:111111    (密码可以为空)
    
    或者 命令自带密码( -passout pass:111111 )
    openssl genrsa -aes256 -passout pass:111111 -out private/ca.key.pem 2048
    

    3、创建CA签名请求

    openssl req -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=*.pldsec.com"
    此处回车之后是需要输入上面的ca私钥密码的,后面一定要加上双引号 或者( -passin pass:111111 ) openssl req -passin pass:111111 -new -key private/ca.key.pem -out private/ca.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=*.pldsec.com"

    这里要注意的是,如果不用-subj参数,那么就会在命令行交互输入签发目标的身份识别信息,这叫DN(Distinguished Name)。其中别的都不要紧,最重要的是CN那一行,因为我这里是根证书,所以我设置为*.pldsec.com,这样我后面用这个CA签发的www.pldsec.com、game.pldsec.com、news.pldsec.com……,全都是有效的

    4、自己签发CA根证书

    openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certificates/ca.cer
    
    或者( -passin pass:111111)
    openssl x509 -req -days 3650 -sha1 -extensions v3_ca -signkey private/ca.key.pem -in private/ca.csr -out certificates/ca.cer -passin pass:111111
    

    5、把根证书从PEM编码转为PKCS编码

    openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certificates/ca.cer -out certificates/ca.p12
    
    或者(-passin pass:111111 -passout pass:111111
    openssl pkcs12 -export -cacerts -inkey private/ca.key.pem -in certificates/ca.cer -out certificates/ca.p12 -passin pass:111111 -passout pass:111111(先验证原有密码,在重新设置新密码,新密码和旧密码可以相同,也可以不同)

    六、签发服务端证书
    1、创建服务端私钥

    openssl genrsa -aes256 -out private/server.key.pem 2048
    
    或者( -passout pass:111111 注意 -passout pass:111111的位置)
    openssl genrsa -aes256 -passout pass:111111 -out private/server.key.pem 2048
    

    2、创建服务端证书签发请求  

    openssl req -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=www.pldsec.com" 
    
    或者 ( -passin pass:111111 )
    openssl req -passin pass:111111 -new -key private/server.key.pem -out private/server.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=www.pldsec.com"
    

      和ca.csr的区别在于,这里的CN不是*.pldsec.com,而是www.pldsec.com,因为我现在是在为www.pldsec.com申请证书

    3、利用CA根证书,签发服务端证书

    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certificates/server.cer
    
    或者( -passin pass:111111 )
    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/server.csr -out certificates/server.cer -passin pass:111111
    

    4、重启Apache

    /usr/local/apache2/bin/apachectl start
    

    假如此时又出错:
      Syntax error on line 95 of /usr/local/apache/conf/extra/httpd-ssl.conf:
      SSLCertificateFile: file '/usr/local/apache/conf/server.crt' does not exist or is empty
      这是因为在启动https时,需要一个证书,而我们还没有为这个网站生成一个证书,为了测试,下面将用openssl生成一个自签名的证书:

    cd /usr/local/apache/conf/
    sudo openssl req -new -x509 -nodes -out server.crt -keyout server.key
    

      下面openssl会要求为证书输入一些相关信息:

        Country Name (2 letter code) [XX]:CH       (国家)
      State or Province Name (full name) []:ZheJiang       (省份)
      Locality Name (eg, city) [Default City]:Hangzhou		(城市)
      Organization Name (eg, company) [Default Company Ltd]:PLDSEC		(组织名称)
      Organizational Unit Name (eg, section) []:pldsec		(组织单位名称)
      Common Name (eg, your name or your server's hostname) []:pldsec	(通用名)
      Email Address []:www@pldsec.com			(邮箱)
    

      

    七、测试单向认证
    把server.key.pem和server.cer拷贝到/usr/local/httpd/conf/目录下,然后启动httpd,会要求输入一个密码(创建私钥的密码)
    然后https://IP 访问(测试HTTP是否正常跳转到HTTPS)

    1、apache设置自动将http跳转到https的方法
    vim /usr/local/apache/conf/httpd.conf
    找到
    <Directory "Apache的环境目录">
    AllowOverride All #这里原先是None要改为All

    在网站根目录下创建.htaccess文件,在最下面添加写入如下语句:

    RewriteEngine on
    RewriteCond %{SERVER_PORT} !^443$
    RewriteRule ^/?(.*)$ https://%{SERVER_NAME}/$1 [L,R]

    重启Apache,如果重启时报错,则找到#LoadModule rewrite_module modules/mod_rewrite.so,将前面的#号去掉,然后重启

    八、配置双向认证

    vim /usr/local/apache/conf/extra/httpd-ssl.conf
    
    SSLCACertificateFile "/usr/local/httpd/conf/ca.cer"  
    SSLVerifyClient require  
    SSLVerifyDepth  10
    

      

    九、签发客户端证书
    1、创建客户端私钥,用户:aaa,密码:aaaaaa

    openssl genrsa -aes256 -out private/aaa.key.pem 2048
    		
    或者(给aaa用户创建一个客户端私钥 密码为aaaaaa)
    openssl genrsa -aes256 -passout pass:aaaaaa -out /usr/local/private/aaa.key.pem 2048
    

    2、创建客户端证书签发请求

    openssl req -new -key private/aaa.key.pem -out private/aaa.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=aaa"
    		
    或者(-passin pass:aaaaaa)
    openssl req -passin pass:aaaaaa -new -key private/chenchao.key.pem -out private/aaa.csr -subj "/C=CN/ST=SZ/L=SZ/O=pldsec/OU=pldsec/CN=aaa"
    

    3、利用CA根证书,签发客户端证书

    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/aaa.csr -out certificates/aaa.cer
    
    或者( -passin pass:111111 输入服务端CA证书私钥密码 )
    openssl x509 -req -days 3650 -sha1 -extensions v3_req -CA certificates/ca.cer -CAkey private/ca.key.pem -CAserial ca.srl -CAcreateserial -in private/aaa.csr -out certificates/aaa.cer -passin pass:111111
    

    4、把客户端证书转换成p12格式

    openssl pkcs12 -export -clcerts -inkey private/aaa.key.pem -in certificates/aaa.cer -out certificates/aaa.p12 
    
    或者 (-passin pass:aaaaaa -passout pass:bbbbbb 先输入客户端密码,然后重置密码,旧密码和新密码可以相同,也可以不同)
    openssl pkcs12 -export -clcerts -inkey private/aaa.key.pem -in certificates/aaa.cer -out certificates/aaa.p12 -passin pass:aaaaaa -passout pass:bbbbbb
    

      这步是必须的,因为稍后就需要把客户端证书导入到浏览器里,但是一般浏览器都不能直接使用PEM编码的证书

    十、测试双向认证
    把ca.cer拷贝到%HTTPD_HOME%/conf/目录下,重启httpd

    cp /usr/local/certificates/ca.cer /usr/local/apache/conf/
    

      

    接下来要把client.p12导入到浏览器里
    导入的时候会要求输入密码,这是为了避免有人偷偷拷贝了别人的客户端证书,伪装成合法用户

  • 相关阅读:
    js实现冒泡排序
    AngularJS控制器
    AngularJS指令
    AngularJS表达式
    AngularJS基础
    Python小例子(判断质数)
    Python小例子(求和)
    Python笔记
    js小例子(简单模糊匹配输入信息)
    word学习笔记
  • 原文地址:https://www.cnblogs.com/rnckty/p/4094495.html
Copyright © 2011-2022 走看看