起因是看到Chrome 60开始有一个Audits的功能,忍不住试了一下,发现我的服务器仍然在使用HTTP/1.1,这个被扣分感觉很不爽。
持证也有一段日子了。发现这问题后在SSLlab上测试了自己的服务器发现了更多的问题!!
必须折腾!
我搜索到这个博,大量参考他的方法,不过发现最新版Apache(2.4.29)已经有点不适应这个教程了。
首先,阿里云的ECS已经有一些系统级的依赖,所以环境并不需要太多东西。
搞定yum之后的必须环境,这里因为php我用的是php71w-fpm,有对应的mysql,所以不卸载php,只卸载之前用yum安装过的httpd
yum -y remove httpd yum -y install wget curl curl-devel gcc gcc-c++
接下来安装PCRE 1
cd /usr/local/src wget https://ftp.pcre.org/pub/pcre/pcre-8.41.tar.gz tar -zxf pcre-8.41.tar.gz cd pcre-8.41 ./configure --prefix=/usr/local/pcre make && make install
ALPN只在OpenSSL 1.02后支持,所以OpenSSL要装1.02n
cd /usr/local/src wget https://www.openssl.org/source/openssl-1.0.2n.tar.gz tar -zxf openssl-1.0.2n.tar.gz cd openssl-1.0.2n ./config --openssldir=/usr/local/openssl zlib-dynamic shared make && make test && make install
cat > /etc/ld.so.conf.d/openssl.conf << EOF /usr/local/openssl/lib EOF ldconfig
cd /usr/local/src wget https://github.com/nghttp2/nghttp2/releases/download/v1.29.0/nghttp2-1.29.0.tar.gz tar -zxf nghttp2-1.29.0.tar.gz cd nghttp2-1.29.0 ./configure --prefix=/usr/local/nghttp2 make && make install
最后是apr apr-util 和 Apache
这里非常重要:--with-mpm一定要设成event或者worker,因为从Apache 2.4.27起mod_http2不再支持默认的prefork模式
如果使用的话之后启动httpd,查看log会看到一个warning:
AH10034: The mpm module (prefork.c) is not supported by mod_http2. The mpm determines how things are processed in your server. HTTP/2 has more demands in this regard and the currently selected mpm will just not do. This is an advisory warning. Your server will continue to work, but the HTTP/2 protocol will be inactive.
意思是可以继续启动,但不会启用HTTP/2
以下是Apache 2.4.29的安装代码
cd /usr/local/src wget http://mirrors.hust.edu.cn/apache/apr/apr-1.6.3.tar.gz wget http://mirrors.hust.edu.cn/apache/apr/apr-util-1.6.1.tar.gz wget http://mirrors.hust.edu.cn/apache/httpd/httpd-2.4.29.tar.gz tar -zxf apr-1.6.3.tar.gz tar -zxf apr-util-1.6.1.tar.gz tar -zxf httpd-2.4.29.tar.gz mv apr-1.6.3 httpd-2.4.29/srclib/apr mv apr-util-1.6.1 httpd-2.4.29/srclib/apr-util cd httpd-2.4.29 ./configure \ --prefix=/usr/local/apache \ --with-pcre=/usr/local/pcre \ --with-mpm=event \ --with-included-apr \ --with-ssl=/usr/local/openssl \ --with-nghttp2=/usr/local/nghttp2 \ --enable-modules=all \ --enable-mods-shared=all \ --enable-so \ --enable-ssl \ --enable-http2 make && make install
下面仍然是照抄:)
cp -f /usr/local/apache/bin/apachectl /etc/init.d/httpd # 拷贝文件到 init.d 里 sed -i '2a # chkconfig: - 85 15' /etc/init.d/httpd sed -i '3a # description: Apache is a World Wide Web server. It is used to server' /etc/init.d/httpd chkconfig --add httpd chkconfig httpd on # 将 httpd 的 2、3、4、5 运行级设置为 On,即开机启动 rm -rf /etc/httpd ln -s /usr/local/apache/ /etc/httpd # /etc/httpd 为运行目录 cd /usr/sbin/ ln -fs /usr/local/apache/bin/httpd ln -fs /usr/local/apache/bin/apachectl cd /var/log rm -rf httpd/ ln -s /usr/local/apache/logs httpd groupadd apache useradd -g apache -s /sbin/nologin apache
Apache的配置
配置上稍微有点繁琐,因为情况不一样,要完全脱离那个教程了。
可以完全使用之前yum安装用的conf。
主conf在 /usr/local/apache/conf/httpd.conf 这个位置
ServerRoot "/usr/local/apache" Listen 80 LoadModule authn_file_module modules/mod_authn_file.so #LoadModule authn_dbm_module modules/mod_authn_dbm.so #LoadModule authn_anon_module modules/mod_authn_anon.so #LoadModule authn_dbd_module modules/mod_authn_dbd.so #LoadModule authn_socache_module modules/mod_authn_socache.so LoadModule authn_core_module modules/mod_authn_core.so LoadModule authz_host_module modules/mod_authz_host.so LoadModule authz_groupfile_module modules/mod_authz_groupfile.so LoadModule authz_user_module modules/mod_authz_user.so #LoadModule authz_dbm_module modules/mod_authz_dbm.so #LoadModule authz_owner_module modules/mod_authz_owner.so #LoadModule authz_dbd_module modules/mod_authz_dbd.so LoadModule authz_core_module modules/mod_authz_core.so LoadModule access_compat_module modules/mod_access_compat.so LoadModule auth_basic_module modules/mod_auth_basic.so #LoadModule auth_form_module modules/mod_auth_form.so #LoadModule auth_digest_module modules/mod_auth_digest.so #LoadModule allowmethods_module modules/mod_allowmethods.so #LoadModule file_cache_module modules/mod_file_cache.so #LoadModule cache_module modules/mod_cache.so #LoadModule cache_disk_module modules/mod_cache_disk.so #LoadModule cache_socache_module modules/mod_cache_socache.so 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 watchdog_module modules/mod_watchdog.so #LoadModule macro_module modules/mod_macro.so #LoadModule dbd_module modules/mod_dbd.so #LoadModule dumpio_module modules/mod_dumpio.so #LoadModule echo_module modules/mod_echo.so #LoadModule buffer_module modules/mod_buffer.so #LoadModule data_module modules/mod_data.so #LoadModule ratelimit_module modules/mod_ratelimit.so LoadModule reqtimeout_module modules/mod_reqtimeout.so #LoadModule ext_filter_module modules/mod_ext_filter.so #LoadModule request_module modules/mod_request.so #LoadModule include_module modules/mod_include.so LoadModule filter_module modules/mod_filter.so #LoadModule reflector_module modules/mod_reflector.so #LoadModule substitute_module modules/mod_substitute.so #LoadModule sed_module modules/mod_sed.so #LoadModule charset_lite_module modules/mod_charset_lite.so LoadModule deflate_module modules/mod_deflate.so LoadModule mime_module modules/mod_mime.so LoadModule log_config_module modules/mod_log_config.so #LoadModule log_debug_module modules/mod_log_debug.so #LoadModule log_forensic_module modules/mod_log_forensic.so #LoadModule logio_module modules/mod_logio.so LoadModule env_module modules/mod_env.so #LoadModule mime_magic_module modules/mod_mime_magic.so LoadModule expires_module modules/mod_expires.so LoadModule headers_module modules/mod_headers.so #LoadModule usertrack_module modules/mod_usertrack.so #LoadModule unique_id_module modules/mod_unique_id.so LoadModule setenvif_module modules/mod_setenvif.so LoadModule version_module modules/mod_version.so #LoadModule remoteip_module modules/mod_remoteip.so #LoadModule proxy_module modules/mod_proxy.so #LoadModule proxy_connect_module modules/mod_proxy_connect.so #LoadModule proxy_ftp_module modules/mod_proxy_ftp.so #LoadModule proxy_http_module modules/mod_proxy_http.so #LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so #LoadModule proxy_scgi_module modules/mod_proxy_scgi.so #LoadModule proxy_fdpass_module modules/mod_proxy_fdpass.so #LoadModule proxy_wstunnel_module modules/mod_proxy_wstunnel.so #LoadModule proxy_ajp_module modules/mod_proxy_ajp.so #LoadModule proxy_balancer_module modules/mod_proxy_balancer.so #LoadModule proxy_express_module modules/mod_proxy_express.so #LoadModule proxy_hcheck_module modules/mod_proxy_hcheck.so #LoadModule session_module modules/mod_session.so #LoadModule session_cookie_module modules/mod_session_cookie.so #LoadModule session_dbd_module modules/mod_session_dbd.so LoadModule slotmem_shm_module modules/mod_slotmem_shm.so #LoadModule slotmem_plain_module modules/mod_slotmem_plain.so #LoadModule ssl_module modules/mod_ssl.so #LoadModule dialup_module modules/mod_dialup.so LoadModule http2_module modules/mod_http2.so #LoadModule lbmethod_byrequests_module modules/mod_lbmethod_byrequests.so #LoadModule lbmethod_bytraffic_module modules/mod_lbmethod_bytraffic.so #LoadModule lbmethod_bybusyness_module modules/mod_lbmethod_bybusyness.so #LoadModule lbmethod_heartbeat_module modules/mod_lbmethod_heartbeat.so LoadModule unixd_module modules/mod_unixd.so #LoadModule heartbeat_module modules/mod_heartbeat.so LoadModule heartmonitor_module modules/mod_heartmonitor.so #LoadModule dav_module modules/mod_dav.so LoadModule status_module modules/mod_status.so LoadModule autoindex_module modules/mod_autoindex.so #LoadModule asis_module modules/mod_asis.so #LoadModule info_module modules/mod_info.so #LoadModule cgi_module modules/mod_cgi.so #LoadModule dav_fs_module modules/mod_dav_fs.so #LoadModule dav_lock_module modules/mod_dav_lock.so #LoadModule vhost_alias_module modules/mod_vhost_alias.so LoadModule negotiation_module modules/mod_negotiation.so LoadModule dir_module modules/mod_dir.so #LoadModule actions_module modules/mod_actions.so #LoadModule speling_module modules/mod_speling.so LoadModule userdir_module modules/mod_userdir.so LoadModule alias_module modules/mod_alias.so LoadModule rewrite_module modules/mod_rewrite.so User apache Group apache ServerName localhost:80 <Directory /> AllowOverride none Require all denied RewriteEngine on RewriteBase / RewriteCond %{SERVER_PORT} !^443$ RewriteRule ^.*$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R] </Directory> DocumentRoot "你的网站主目录" <Directory "你的网站主目录"> Options Indexes FollowSymLinks AllowOverride All #为了让.htaccess和.htpassword生效。 Require all granted </Directory> IncludeOptional conf/extra/*.conf ... ServerTokens ProductOnly ServerSignature Off
然后/usr/local/apache/conf/extra/httpd-ssl.conf,这个配置默认可能写在httpd-vhosts.conf里。
<VirtualHost _default_:443> Protocols h2 http/1.1 </VirtualHost>
php-fpm.conf放入到extra里,开始服务吧。
/etc/init.d/httpd start
去SSLlab上测试下,会发现还是给了C
优化一下/usr/local/apache/conf/extra/httpd-ssl.conf,
<VirtualHost _default_:443> Protocols h2 http/1.1 ErrorLog logs/ssl_error_log TransferLog logs/ssl_access_log LogLevel warn SSLEngine on SSLProtocol all -SSLv2 -SSLv3 #disable SSLv3,已经被抛弃了 SSLCipherSuite HIGH:!aNULL:!eNULL:!kECDH:!aDH:!RC4:!3DES:!CAMELLIA:!MD5:!PSK:!SRP:!KRB5:@STRENGTH #这里主要是disable RC4 SSLHonorCipherOrder on ...证书设置 </VirtualHost>
再起服务,应该可以可以拿到A了。
不知道TSL更新到1.3是不是又一个大坑。