操作环境:Mac OS
一、搭建简单的HTTP连接
1、安装apache服务
1) 查看apache是否安装,若未安装,立即安装
apachectl -v
2) 修改配置文件
前往/etc/apache2文件夹,打开其中最重要的配置文件httpd.conf
(带d的名字的文件是守护进程的配置文件)
重点关注三个模块,想使用哪个模块去掉启用模块的注释即可。
虚拟主机配置模块 默认开启
ssl启用模块 LoadModule ssl_module libexec/apache2/mod_ssl.so
php启用模块 LoadModule php5_module libexec/apache2/libphp5.so
其中,虚拟主机配置信息存放在httpd-vhost.conf中,ssl配置信息存放在httpd-ssl.conf中。开启apache服务必然访问httpd.conf文件,若想访问其他文件,在httpd.conf文件中include其它文件的绝对路径即可,服务启动时所有include的文件都被访问到。
# Virtual hosts
Include /private/etc/apache2/extra/httpd-vhosts.conf
# Secure (SSL/TLS) connections
Include /private/etc/apache2/extra/httpd-ssl.conf
ps: 可以随便在httpd.conf或者include的任何文件中写任何配置信息,例如,在httpd-vhosts.conf文件中写ssl配置信息,或者在httpd.conf文件中写所有配置信息而不include任何文件。include文件只是便于我们对目标模块的查找和修改,所以简单约定在httpd-vhosts.conf中写非安全的虚拟主机配置,在httpd-ssl.conf中写安全的虚拟主机配置。
3) 配置虚拟主机
打开httpd-vhosts.conf文件,配置n个虚拟主机,下面以一个虚拟主机为例。
Listen 3501 为指定端口号设置监听
DocumentRoot “yourRootDir’s absolute path"
ServerName www.example.com ( 域名,随便取)
ErrorLog "/var/log/apache2/example-error_log"
CustomLog "/var/log/apache2/example-access_log" common
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all ( ps:记得把deny from all改成allow from all)
4) 配置域名到ip的映射
打开/etc/hosts 文件,添加一行
127.0.0.1 www.example.com
5) 开启apache服务
sudo apachectl configtest 检查配置文件有没有语法错误,若出错按提示修改即可
sudo apachectl start 开启
sudo apachectl stop 停止
sudo apachectl restart 重启
ps:我在开启带ssl模块的apache过程中遇到configtest没有问题,但执行sudo start命令时apache总是无法开启。然后我尝试执行下面的命令就行了???反正要多试。
sudo apachectl -k start 开启
sudo apachectl -k stop 停止
sudo apachectl -k restart 重启
检查apache是否开启(多种方案,多尝试)
查看http守护进程是否增多 ps -ef|grep httpd
尝试连接你设置的虚拟主机 telnet www.example.com 3501
查看当前正在监听的端口中有没有你设置的端口号 netstat -a -v
2、在配置的虚拟主机根目录下创建html文件,在浏览器中输入域名、端口、路径文件后得到。
例如,创建一个p1.html
3、若是只输入域名和端口号,可能出现提示You don't have permission to access / on this server.
这是因为虚拟主机目录下没有index.html启动页,需要输入请求的具体页面才能正常访问。
二、自建CA,搭建安全的HTTPS连接
1、自建CA
1) 安装openssl
查看是否安装 openssl version
2) 创建初始工作环境
目录准备:cd && mkdir -p myCA/signedcerts && mkdir myCA/private && cd myCA
创建并进入myCA,同时生成两个子目录 signedcerts和private
myCA用于存放CA根证书,证书数据库,以及后续服务器生成的证书,密钥以及请求
signedcerts:保存签名证书的copy
private: 包含CA私钥
3) 创建caconfig.cnf文件
echo '01'>serial && touh index.txt,然后创建caconfig.cnf文件。sudo vi ~/myCA/caconfig.cnf 内容如下:
# My sample caconfig.cnf file.
#
# Default configuration to use when one is not provided on the command line.
#
[ ca ]
default_ca = local_ca
#
#
# Default location of directories and files needed to generate certificates.
#
[ local_ca ]
dir = /home/
certificate = $dir/cacert.pem
database = $dir/index.txt
new_certs_dir = $dir/signedcerts
private_key = $dir/private/cakey.pem
serial = $dir/serial
#
#
# Default expiration and encryption policies for certificates.
#
default_crl_days = 365
default_days = 1825
default_md = SHA256
#
policy = local_ca_policy
x509_extensions = local_ca_extensions
#
#
# Default policy to use when generating server certificates. The following
# fields must be defined in the server certificate.
#
[ local_ca_policy ]
commonName = supplied
stateOrProvinceName = supplied
countryName = supplied
emailAddress = supplied
organizationName = supplied
organizationalUnitName = supplied
#
#
# x509 extensions to use when generating server certificates.
#
[ local_ca_extensions ]
subjectAltName = DNS:localhost
basicConstraints = CA:false
nsCertType = server
#
#
# The default root certificate generation policy.
#
[ req ]
default_bits = 2048
default_keyfile = /home/
default_md = SHA256
#
prompt = no
distinguished_name = root_ca_distinguished_name
x509_extensions = root_ca_extensions
#
#
# Root Certificate Authority distinguished name. Change these fields to match
# your local environment!
#
[ root_ca_distinguished_name ]
commonName = MyOwn Root Certificate Authority
stateOrProvinceName = Jiangsu
countryName = CN
emailAddress = [email protected]
organizationName = xxx
organizationalUnitName = IT Department
#
[ root_ca_extensions ]
basicConstraints = CA:true
4) 生成CA 根证书和密钥。
export OPENSSL_CONF=~/myCA/caconfig.cnf,该命令用于给环境变量OPENSSL_CONF赋值为caconfig.cnf。
然后,生成CA根证书和密钥
openssl req -x509 -newkey rsa:2048 -out cacert.pem -outform PEM -days 1825
该命令需要用户设置密码。不要忘记。
以上步骤生成了CA自签名根证书,和RSA公/私密钥对。证书的格式是PEM,有效期是1825天。
/myCA/cacert.pem: CA根证书
/myCA/private/cakey.pem:CA私钥
5) 创建服务器公私钥,并让CA签名,生成服务器证书。
生成服务器配置文件~/myCA/exampleserver.cnf,例子如下:
#
# exampleserver.cnf
#
[ req ]
prompt = no
distinguished_name = server_distinguished_name
[ server_distinguished_name ]
commonName = localhost 这里的common name必须与你的虚拟主机的域名相同
stateOrProvinceName = Jiangsu
countryName = CN
emailAddress = [email protected]
organizationName = xxx
organizationalUnitName = SE
配置文件准备好之后,使用如下命令生成服务器证书:
export OPENSSL_CONF =/
该命令设置环境变量OPENSSL_CONF,使得openssl更换配置文件。
然后生成证书和密钥:
openssl req -newkey rsa:1024 -keyout tempkey.pem -keyform PEM -out tempreq.pem -outform PEM
同样的,需要输入密码短语。
然后,需要将临时私钥转换为unencrypted key。命令如下:
openssl rsa < tempkey.pem > server_key.pem
需要输入密码短语。
如果希望将key保持为加密状态,直接改名
mv tempkey.pem server_key.pem
现在,需要使用CA key对服务器证书签名:
export OPENSSL_CONF=/
openssl ca -in tempreq.pem -out server_crt.pem
删除临时证书和密码文件。
rm -f tempkey.pem && rm -f tempreq.pem
现在,自签名的服务器证书和密钥对便产生了:
1. server_crt.pem : 服务器证书文件
2. server_key.pem : 服务器密钥文件
2、配置apache
1) 启用ssl模块
打开httpd.conf文件,取消ssl启动模块的注释,include httpd-ssl.conf文件
2) 在httpd-ssl.conf文件中配置带ssl的虚拟主机
Listen 8080 监听一个8080端口
SSLEngine on 开启ssl引擎
SSLCipherSuite ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL
SSLCertificateFile /
SSLCertificateKeyFile /
ServerName www.example.com 该域名需与服务器公钥的url相同
DocumentRoot “your root dir’s absolute path”
Options FollowSymLinks
AllowOverride None
Order deny,allow
Allow from all
3) 开启apache服务
4) 在浏览器中导入CA根证书
打开FireFox浏览器,依次选择“编辑”----“首选项”----“高级”----“证书”栏----“查看证书”----“证书机构”
点击导入,选择myCA目录下的根证书“cacert.pem”, 导入。
5) 在配置的虚拟主机根目录下创建html文件,在浏览器中输入域名、端口、路径文件后得到。
例如,创建一个p1.html