马蛋的 一开始 在主配置文件中配置了443端口转发,后面又再监听443端口发来的请求,导致 一直显示 端口 绑定不上。
根本原因:一个端口被配置了两次,导致启动的时候端口无法绑定,造成启动失败。
当你年老时,你是否常常想,要是年轻时多努力下该好。
马蛋的 一开始 在主配置文件中配置了443端口转发,后面又再监听443端口发来的请求,导致 一直显示 端口 绑定不上。
根本原因:一个端口被配置了两次,导致启动的时候端口无法绑定,造成启动失败。
# 查看 nginx 是否已经安装及具体版本号 sh-4.2# rpm -qa | grep -i nginx nginx-1.12.2-1.el7_4.ngx.x86_64
# 查看 nginx 的安装目录 sh-4.2# rpm -ql nginx-1.12.2-1.el7_4.ngx.x86_64 /etc/logrotate.d/nginx /etc/nginx /etc/nginx/conf.d /etc/nginx/conf.d/default.conf /etc/nginx/fastcgi_params /etc/nginx/koi-utf /etc/nginx/koi-win /etc/nginx/mime.types /etc/nginx/modules /etc/nginx/nginx.conf /etc/nginx/scgi_params /etc/nginx/uwsgi_params /etc/nginx/win-utf /etc/sysconfig/nginx /etc/sysconfig/nginx-debug /usr/lib/systemd/system/nginx-debug.service /usr/lib/systemd/system/nginx.service /usr/lib64/nginx /usr/lib64/nginx/modules /usr/libexec/initscripts/legacy-actions/nginx /usr/libexec/initscripts/legacy-actions/nginx/check-reload /usr/libexec/initscripts/legacy-actions/nginx/upgrade /usr/sbin/nginx /usr/sbin/nginx-debug /usr/share/doc/nginx-1.12.2 /usr/share/doc/nginx-1.12.2/COPYRIGHT /usr/share/man/man8/nginx.8.gz /usr/share/nginx /usr/share/nginx/html /usr/share/nginx/html/50x.html /usr/share/nginx/html/index.html /var/cache/nginx /var/log/nginx sh-4.2#
将 证书相关 文件 放到 /etc/nginx/https_cert目录里。
新建这个https_cert目录,其实可以指定的别的目录,只要配置文件引用目录正确就行了。
https证书的获取,可以查看密码和证书-https(ssl/tls)之证书的概述及获取和网站部署
1.1、开启443 端口
listen 443 ssl;
1.2、添加密钥
备注:nginx 即可以 读取 crt 文件 也可以读取 pem 文件。
# 这里是 相对路径 ,绝对路径是 /etc/nginx/https_cert/huaijiujia_ca_chained.crt # 因为 nginx的主配置文件路径是 /etc/nginx/nginx.conf # 证书文件,里面有公钥 ssl_certificate https_cert/huaijiujia_ca_chained.crt; # 私钥 ssl_certificate_key https_cert/huaijiujia_private.key;
(1)补充:ssl_client_certificate /etc/ssl/certs/ca.crt;
这个是客户端证书文件,用来验证客户端的身份的,比如访问银行网站需要的K宝证书文件。一般的网站基本用不到。
(2)补充:一般申请的证书,会给出三个文件。
第一个是证书文件,里面有公钥。第二个是私钥。第三个是证书组文件,因为公钥是由中间机构签发的,一些浏览器可能不能识别,所以证书组就是为了证明从根证书到中间签发机构都是可信的。
SSLCertificateFile /etc/ssl/example_com.crt SSLCertificateKeyFile /etc/ssl/private/example_com.key SSLCertificateChainFile /etc/ssl/example_com.ca-bundle
在nginx配置文件中:只有ssl_certificate
和 ssl_certificate_key
,所以需要将证书文件和证书组文件,组合在一起,生成一个证书链文件。
cat example_com.crt example_com.ca-bundle > example_com.chained.crt
记得一定要先将证书放在前面,然后将证书组放在后面。这样才能解析成功。
但是在实际生成过程中:证书链生成的还是有问题。实际用cat生成时,中间的
-----END CERTIFICATE----- -----BEGIN CERTIFICATE----- ### 会合并成一行 -----END CERTIFICATE----------BEGIN CERTIFICATE----- ### 特别注意:切分的时候,每一行的格式都是统一的,前面都是 ----- 五个破折号
下面举例,正确的证书链文件内容:
-----BEGIN CERTIFICATE----- MIIFbDCCBFSgAwIBAgISA5WD5KQw2Su8QWrrv6G5nlVfMA0GCSqGSIb3DQEBCwUA MEoxCzAJBgNVBAYTAlVTMRYwFAYDVQQKEw1MZXQncyBFbmNyeXB0MSMwIQYDVQQD ExpMZXQncyBFbmNyeXB0IEF1dGhvcml0eSBYMzAeFw0xODExMjMxMDAwMjdaFw0x OTAyMjExMDAwMjdaMB0xGzAZBgNVBAMTEnd3dy5odWFpaml1amlhLmNvbTCCASIw DQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAPB7xpQSEdD5ZvYU80fBiWaTRHa4 p1ONueojFD6NabMRMw2ct4PLHsiIt8z5hGF02JhKb/ZxLIIBh5dtqFxAy4OcYRWa J+7Qi+1tgD695t0JkqsW/KGbbZtZRFHikhx4TTLyd5IWuEKjJA87+8ufgCv/zuEM hpdqNs5YhjqrVNjLo5yIIwVWF4FRs3rkSqUthaw6bF3+ER5Cnlrmy4nM6t811KuS aFAFU9ZpfxzbtFefVNZGn79CxMf9huvHUklJTZeUmtr8SkfRLSC8yclP2vW4l70G EiT1UK7jPb+/x2qynnDMv+/EfYk3oJq1emTg1UNizLmKPAItWDhI50BGKa8CAwEA AaOCAncwggJzMA4GA1UdDwEB/wQEAwIFoDAdBgNVHSUEFjAUBggrBgEFBQcDAQYI KwYBBQUHAwIwDAYDVR0TAQH/BAIwADAdBgNVHQ4EFgQUCG4SDRTDi0shGxdi/x7S ZFrxaSswHwYDVR0jBBgwFoAUqEpqYwR93brm0Tm3pkVl7/Oo7KEwbwYIKwYBBQUH AQEEYzBhMC4GCCsGAQUFBzABhiJodHRwOi8vb2NzcC5pbnQteDMubGV0c2VuY3J5 cHQub3JnMC8GCCsGAQUFBzAChiNodHRwOi8vY2VydC5pbnQteDMubGV0c2VuY3J5 cHQub3JnLzAtBgNVHREEJjAkgg5odWFpaml1amlhLmNvbYISd3d3Lmh1YWlqaXVq aWEuY29tMEwGA1UdIARFMEMwCAYGZ4EMAQIBMDcGCysGAQQBgt8TAQEBMCgwJgYI KwYBBQUHAgEWGmh0dHA6Ly9jcHMubGV0c2VuY3J5cHQub3JnMIIBBAYKKwYBBAHW eQIEAgSB9QSB8gDwAHYAdH7agzGtMxCRIZzOJU9CcMK//V5CIAjGNzV55hB7zFYA AAFnQDpiswAABAMARzBFAiEAyP9RowhmAeFy0FIw864vexsfEi7+I8eXXgRBgdma lXACIFuyRLDwlDSymNcSibTq/RJt4AlYtVAs2zA9lOUOGwN4AHYAY/Lbzeg7zCzP C3KEJ1drM6SNYXePvXWmOLHHaFRL2I0AAAFnQDpiuAAABAMARzBFAiEAtLhwBegO 6Hvo3lTzkb1OBW1pmI00QMalMyyp7a8l3DICICdx6IzPP8Q9Aj5nwHXr7TZId+ye pT2ApN87VE74fiT8MA0GCSqGSIb3DQEBCwUAA4IBAQBJZ0dI9Uq8WzRagYaRZI3p BelzOZ0ImRW3iipi/XBHFB3hXbEIMBvaPlzduZzYe70WRYJFkHTCdVWrUqhUuEv9 B0Q5ovW9KDcrDJVw7C9Y4UbpfDnq6NBxXXRr3azNUahCoYIVvTTNcfFiWXvhW2Ie Yw3v1dfH4pxdeZodBInaikJ1o2IAYWXQVRuX06ywcItFIcH9aUuvP8g0DEEe3xwf iIV3IJ+rUzEHLh/r+9CabSotT5TqwvYPLWnhBUD3YaD56VXGlipdZ7bQiH80CUXw WvmDH84qEJ+D7btxFBYl+OP7irl3cdcQNmYYJOQWyMOK0h+AhSEBx7qpDOC/Ew1b -----END CERTIFICATE----- -----BEGIN CERTIFICATE----- MIIEkjCCA3qgAwIBAgIQCgFBQgAAAVOFc2oLheynCDANBgkqhkiG9w0BAQsFADA/ MSQwIgYDVQQKExtEaWdpdGFsIFNpZ25hdHVyZSBUcnVzdCBDby4xFzAVBgNVBAMT DkRTVCBSb290IENBIFgzMB4XDTE2MDMxNzE2NDA0NloXDTIxMDMxNzE2NDA0Nlow SjELMAkGA1UEBhMCVVMxFjAUBgNVBAoTDUxldCdzIEVuY3J5cHQxIzAhBgNVBAMT GkxldCdzIEVuY3J5cHQgQXV0aG9yaXR5IFgzMIIBIjANBgkqhkiG9w0BAQEFAAOC AQ8AMIIBCgKCAQEAnNMM8FrlLke3cl03g7NoYzDq1zUmGSXhvb418XCSL7e4S0EF q6meNQhY7LEqxGiHC6PjdeTm86dicbp5gWAf15Gan/PQeGdxyGkOlZHP/uaZ6WA8 SMx+yk13EiSdRxta67nsHjcAHJyse6cF6s5K671B5TaYucv9bTyWaN8jKkKQDIZ0 Z8h/pZq4UmEUEz9l6YKHy9v6Dlb2honzhT+Xhq+w3Brvaw2VFn3EK6BlspkENnWA a6xK8xuQSXgvopZPKiAlKQTGdMDQMc2PMTiVFrqoM7hD8bEfwzB/onkxEz0tNvjj /PIzark5McWvxI0NHWQWM6r6hCm21AvA2H3DkwIDAQABo4IBfTCCAXkwEgYDVR0T AQH/BAgwBgEB/wIBADAOBgNVHQ8BAf8EBAMCAYYwfwYIKwYBBQUHAQEEczBxMDIG CCsGAQUFBzABhiZodHRwOi8vaXNyZy50cnVzdGlkLm9jc3AuaWRlbnRydXN0LmNv bTA7BggrBgEFBQcwAoYvaHR0cDovL2FwcHMuaWRlbnRydXN0LmNvbS9yb290cy9k c3Ryb290Y2F4My5wN2MwHwYDVR0jBBgwFoAUxKexpHsscfrb4UuQdf/EFWCFiRAw VAYDVR0gBE0wSzAIBgZngQwBAgEwPwYLKwYBBAGC3xMBAQEwMDAuBggrBgEFBQcC ARYiaHR0cDovL2Nwcy5yb290LXgxLmxldHNlbmNyeXB0Lm9yZzA8BgNVHR8ENTAz MDGgL6AthitodHRwOi8vY3JsLmlkZW50cnVzdC5jb20vRFNUUk9PVENBWDNDUkwu Y3JsMB0GA1UdDgQWBBSoSmpjBH3duubRObemRWXv86jsoTANBgkqhkiG9w0BAQsF AAOCAQEA3TPXEfNjWDjdGBX7CVW+dla5cEilaUcne8IkCJLxWh9KEik3JHRRHGJo uM2VcGfl96S8TihRzZvoroed6ti6WqEBmtzw3Wodatg+VyOeph4EYpr/1wXKtx8/ wApIvJSwtmVi4MFU5aMqrSDE6ea73Mj2tcMyo5jMd6jmeWUHK8so/joWUoHOUgwu X4Po1QYz+3dszkDqMp4fklxBwXRsW10KXzPMTZ+sOPAveyxindmjkW8lGy+QsRlG PfZ+G6Z6h7mjem0Y+iWlkYcV4PIWL1iwBi8saCbGS5jN2p8M+X+Q7UNKEkROb3N6 KOqkqm57TH2H3eDJAkSnh6/DNFu0Qg== -----END CERTIFICATE-----
1.3、配置 SSL协议和加密方式
ssl_protocols TLSv1 TLSv1.1 TLSv1.2; ssl_ciphers HIGH:!aNULL:!MD5;
2.1、在443 监听端口时,配置 http2 标签。
listen 443 http2 ssl;
2.2、提高加密的方式:【http 2 需要安全度高的加密方式】
ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5;
server { # listen 80; listen [::]:443 ssl http2 ipv6only=on; listen 443 http2 ssl; server_name www.huaijiujia.com; ssl_certificate https_cert/huaijiujia_ca_chained.crt; ssl_certificate_key https_cert/huaijiujia_private.key; ssl_protocols TLSv1 TLSv1.1 TLSv1.2; # ssl_ciphers HIGH:!aNULL:!MD5; ssl_ciphers EECDH+CHACHA20:EECDH+AES128:RSA+AES128:EECDH+AES256:RSA+AES256:EECDH+3DES:RSA+3DES:!MD5; #charset koi8-r; #access_log /var/log/nginx/host.access.log main; root /var/www/www.huaijiujia.com; #wordpress local index index.php index.html index.htm; location / { # try_files $uri $uri/ =404; try_files $uri $uri/ /index.php?q=$uri&args; } location ~ \.php$ { try_files $uri =404; # fastcgi_pass 127.0.0.1:9000; # fastcgi_pass unix:/var/run/php-fpm/php-fcgi.sock; fastcgi_pass unix:/dev/shm/php-fcgi.sock; # put into memorey ,but get error , i give up,finally get ok https://blog.linuxeye.cn/364.html fastcgi_index index.php; fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name; include fastcgi_params; } }
注意nginx开启了,https后,要记得 防火墙 开 443 端口的 tcp
firewall–cmd —permanent —add–port=443/tcpfirewall–cmd —reload
如果是源码编译安装nginx,可能没有安装ssl模块,需要重新 编译安装。
[楼主是用yum安装,和源码安装的目录位置 可能不同 ]
1.the "ssl" parameter requires ngx_http_ssl_module in /usr/local/nginx/conf/nginx.conf:37 原因是nginx缺少http_ssl_module模块,编译安装时带上--with-http_ssl_module配置就可以了 2.如果已经安装过nginx,想要添加模块看下面 1)切换到nginx源码包 cd /usr/local/src/nginx-1.11.3 2)查看ngixn原有的模块 /usr/local/nginx/sbin/nginx -V 3)重新配置 ./configure --prefix=/usr/local/nginx --with-http_stub_status_module --with-http_ssl_module 4)重新编译,不需要make install安装。否则会覆盖 make 5)备份原有已经安装好的nginx cp /usr/local/nginx/sbin/nginx /usr/local/nginx/sbin/nginx.bak 6)将刚刚编译好的nginx覆盖掉原来的nginx(ngixn必须停止) cp ./objs/nginx /usr/local/nginx/sbin/ 这时,会提示是否覆盖,请输入yes,直接回车默认不覆盖 7)启动nginx,查看nginx模块,发现已经添加 /usr/local/nginx/sbin/nginx -V
1、listen 指令后面有一个参数default_server
,这个参数是在 0.8.21 版本以后才有的,而之前是default
指令。Nginx 的虚拟主机是通过HTTP请求中的Host值来找到对应的虚拟主机配置,如果找不到呢?那 Nginx 就会将请求送到指定了 default_server 的 节点来处理,如果没有指定为 default_server 的话,就跑到 localhost 的节点,如果没有 localhost 的节点,那只好 404 了。
2、server_name _;
这里指定的不是什么特别的名字,它只是一个无效的域名。从来不会匹配任何真实名字相匹配。
这里介绍修改配置文件nginx.conf两种方法: 1)在server段里插入如下正则: listen 80; server_name www.yuyangblog.net; if ($host != 'www.yuyangblog.net'){ return 403; } 2)添加一个server 新加的server(注意是新增,并不是在原有的server基础上修改) server { listen 80 default; server_name _; return 403; }
必须要提供 ssl证书,才能 正确执行 ip 屏蔽 操作。
server { listen 443 ssl default_server; ssl_certificate path_to_your_fullchain.cer; ssl_certificate_key paht_to_your_key; return 301 https://demo.com; #other return way #return 400; # ban ip access to https server ,return 444, 404 is also OK }
编辑主配置文件:/etc/nginx/nginx.conf
下面的配置是将 443 端口的所有流量,转发给 本机的 8443 端口。
stream { upstream simple-obfs-support { hash $remote_addr consistent; server 127.0.0.1:8443; # ip:port } server { listen 443; proxy_pass simple-obfs-support; } }
大白话:就是将一台服务器的请求转发给后面多台服务器。
upstream backend { #① server backend1.example.com weight=5; server backend2.example.com:8080; server unix:/tmp/backend3; server backup1.example.com:8080 backup; server backup2.example.com:8080 backup; } server { location / { proxy_pass http://backend; #② } }
注意有①,和②行的写法。要引用backend模块,只需把它制定成http://backend
就行。
当一开始安装配置好 sbt时,刚在 终端 输入 sbt
命令 ,想启动sbt时就发现报错了。
[error] (run-main-0) java.lang.UnsupportedClassVersionError: akka/event/LogSource : Unsupported major.minor version 52.0 java.lang.UnsupportedClassVersionError: akka/event/LogSource : Unsupported major.minor version 52.0 at java.lang.ClassLoader.defineClass1(Native Method) at java.lang.ClassLoader.defineClass(ClassLoader.java:803) at java.security.SecureClassLoader.defineClass(SecureClassLoader.java:142) at java.net.URLClassLoader.defineClass(URLClassLoader.java:449) at java.net.URLClassLoader.access$100(URLClassLoader.java:71) at java.net.URLClassLoader$1.run(URLClassLoader.java:361) at java.net.URLClassLoader$1.run(URLClassLoader.java:355) at java.security.AccessController.doPrivileged(Native Method) at java.net.URLClassLoader.findClass(URLClassLoader.java:354) at java.lang.ClassLoader.loadClass(ClassLoader.java:425) at java.lang.ClassLoader.loadClass(ClassLoader.java:358) at java.lang.Class.getDeclaredMethods0(Native Method) at java.lang.Class.privateGetDeclaredMethods(Class.java:2625) at java.lang.Class.getMethod0(Class.java:2866) at java.lang.Class.getMethod(Class.java:1676)
原因是,系统版本的jdk 与 sbt 不兼容,将系统中的 jdk 7 升级到 jdk 8 就行了。
参考:https://stackoverflow.com/questions/39197422/scala-sbt-run-unsupported-major-minor-version-52-0
创建文件SimpleProject/hw.scala
object Hi{ def main(args: Array[String]) = println("Hello world!") }
运行
D:\MyCode\Scala\SimpleProject>sbt Java HotSpot(TM) 64-Bit Server VM warning: ignoring option MaxPermSize=256m; support was removed in 8.0 [info] Loading global plugins from C:\Users\test\.sbt\0.13\plugins [info] Set current project to hello (in build file:/D:/MyCode/Scala/SimpleProject/) > run [info] Updating {file:/D:/MyCode/Scala/SimpleProject/}root... [info] Resolving org.fusesource.jansi#jansi;1.4 ... [info] Done updating. [info] Compiling 1 Scala source to D:\MyCode\Scala\BuildProject\target\scala-2.10\classes... [info] Running Hi Hello world! [success] Total time: 43 s, completed 2016-4-9 20:16:21
sbt项目目录与Maven项目目录类似,创建下面的目录:
├── src │ ├── main │ │ ├── java │ │ ├── resources │ │ └── scala │ ├── test │ │ ├── java │ │ ├── resources │ │ └── scala ├── build.sbt ├── project │ ├── build.properties │ ├── plugins.sbt
其中bulid.sbt为构建定义,project目录是你的工程内另一个工程的项目,它知道如何构建你的工程,即project项目为元构建,相关文档为http://www.scala-sbt.org/0.13/docs/zh-cn/Organizing-Build.html。
简单的bulid.sbt文件
name := "hello" // 项目名称 organization := "xxx.xxx.xxx" // 组织名称 version := "0.0.1" // 版本号 scalaVersion := "2.10.6" // 使用的Scala版本号 // 添加项目依赖 libraryDependencies += "ch.qos.logback" % "logback-core" % "1.0.0" libraryDependencies += "ch.qos.logback" % "logback-classic" % "1.0.0" // 或者 libraryDependencies ++= Seq( "ch.qos.logback" % "logback-core" % "1.0.0", "ch.qos.logback" % "logback-classic" % "1.0.0", ... ) // 添加测试代码编译或者运行期间使用的依赖 libraryDependencies ++= Seq("org.scalatest" %% "scalatest" % "1.8" % "test")
创建项目目录并添加配置文件完成后,生成eclipse项目:在项目基目录下运行下列命令
sbt eclipse
通过上面的命令能够生成eclipse目录,使用eclipse导入项目,即可开始开发。
在项目目录下运行sbt
命令进行交互模式
# 在交互模式中能够运行常见的命令,例如,进行compile: > compile
其它常见命令:
clean | 删除所有生成的文件 (在 target 目录下)。 |
compile | 编译源文件(在 src/main/scala 和 src/main/java 目录下)。 |
test | 编译和运行所有测试。 |
console | 进入到一个包含所有编译的文件和所有依赖的 classpath 的 Scala 解析器。输入 :quit, Ctrl+D (Unix),或者 Ctrl+Z (Windows) 返回到 sbt。 |
run <参数>* | 在和 sbt 所处的同一个虚拟机上执行项目的 main class。 |
package | 将 src/main/resources 下的文件和 src/main/scala 以及 src/main/java 中编译出来的 class 文件打包成一个 jar 文件。 |
help <命令> | 显示指定的命令的详细帮助信息。如果没有指定命令,会显示所有命令的简介。 |
reload | 重新加载构建定义(build.sbt, project/*.scala, project/*.sbt 这些文件中定义的内容)。在修改了构建定义文件之后需要重新加载。 |
参考:https://www.cnblogs.com/codingexperience/p/5372617.html
sbt是类似ANT、MAVEN的构建工具,全称为Simple build tool,是Scala事实上的标准构建工具。
主要特性:
下载地址:官网 ,安装方法:
### mac平台 直接安装 ,自动设置了环境变量 $ brew install sbt@1 ### 安装过程如下 cooldeMacBook-Pro:~ cool$ brew install sbt@1 ==> Downloading https://github.com/sbt/sbt/releases/download/v1.2.6/sbt-1.2.6.tgz ==> Downloading from https://github-production-release-asset-2e65be.s3.amazonaws.com/27955 curl: (28) Connection timed out after 5004 milliseconds Trying a mirror... ==> Downloading https://sbt-downloads.cdnedge.bluemix.net/releases/v1.2.6/sbt-1.2.6.tgz ######################################################################## 100.0% ==> Caveats You can use $SBT_OPTS to pass additional JVM options to sbt. Project specific options should be placed in .sbtopts in the root of your project. Global settings should be placed in /usr/local/etc/sbtopts ==> Summary 🍺 /usr/local/Cellar/sbt/1.2.6: 521 files, 49.8MB, built in 51 seconds cooldeMacBook-Pro:~ cool$ # ============================= ## 非 mac 平台,下载后解压到自己定义的文件夹,然后将解压目录的bin目录加入PATH环境 # Linux环境,使用`sudo vim /etc/profile`打开配置文件,添加下面的命令 export SBT_HOME=/opt/sbt export path=path:$SBT_HOME/bin # Windows 平台 打开高级系统设置, # 在环境变量中添加系统变量 # SBT_HOME => D:\sbt # 并加入path路径, # path=> path;%SBT_HOME%\bin
检验是否安装成功:使用sbt命令,该命令会执行一段时间,下载jar包,加载插件,最后查看是否进行交互界面,如下所示:
skydeMacBook-Pro:~ sky$ sbt [info] Updated file /Users/cool/project/build.properties: set sbt.version to 1.2.6 [info] Loading settings for project global-plugins from idea.sbt ... [info] Loading global plugins from /Users/cool/.sbt/1.0/plugins [info] Updating ProjectRef(uri("file:/Users/cool/.sbt/1.0/plugins/"), "global-plugins")... [info] Done updating. [info] Loading project definition from /Users/cool/project [info] Updating ProjectRef(uri("file:/Users/cool/project/"), "cool-build")... [info] Done updating. [info] Set current project to cool (in build file:/Users/cool/) [info] sbt server started at local:///Users/cool/.sbt/1.0/server/a50398cff041de74d7d0/sock sbt:cool>
配置ivy目录:
可以对sbt进行配置,能够配置ivy的文件目录,ivy是sbt的默认管理项目依赖工具,它默认是在user home下建立library repository【我看到的默认目录变成了用户根目下面的–> .ivy2 】,但用户可以配置ivy的library local repository。
修改sbt配置文件: [sbt安装目录]/conf/sbtconfig.txt,在配置文件中添加一行
-Dsbt.ivy.home=[你自己挑选的目录]/repository
配置镜像库:
感觉sbt运行时会从maven官网下载大量的jar包,可能会非常缓慢,可以添加国内的maven库,从而能够加快运行速度,在”~/.sbt”下创建repositories文件,添加下面的内容:
[repositories] local # 本地ivy库 maven-local: file://~/.m2/repository # 本地Maven库 osc: http://maven.aliyun.com/nexus/content/groups/public/ #阿里云的maven库,用于加快速度 typesafe: http://repo.typesafe.com/typesafe/ivy-releases/, [organization]/[module]/(scala_[scalaVersion]/)(sbt_[sbtVersion]/)[revision]/[type]s/[artifact](-[classifier]).[ext], bootOnly sonatype-oss-releases maven-central sonatype-oss-snapshots
配置插件:
sbt有自己的插件,这里介绍能够生成eclipse目录的插件:sbteclipse插件https://github.com/typesafehub/sbteclipse。
添加sbteclipse插件可以通过两种方式添加:
配置全局文件:~/.sbt/0.13/plugins/plugins.sbt
配置项目文件: PROJECT_DIR/project/plugins.sbt
# 只要在其中一个文件添加 下面的一行 就行了 addSbtPlugin("com.typesafe.sbteclipse" % "sbteclipse-plugin" % "4.0.0") # 安装sbteclipse插件后可以在sbt交互界面使用`eclipse`命令生成eclipse项目
参考:
https://www.scala-sbt.org/1.x/docs/Installing-sbt-on-Mac.html
https://www.cnblogs.com/codingexperience/p/5372617.html
lsof -i:443 /usr/share/nginx/html /etc/nginx/conf.d /var/log/nginx/error.log vim /etc/nginx/conf.d/www.huaijiujia.com.conf systemctl restart nginx [root@superguy ~]# hostnamectl set-hostname amazon.com [root@superguy ~]# ## 非 ss 流量端口 转发 --failover www.amazon.com:443 vim /etc/php-fpm.d/www.conf systemctl restart php-fpm chmod 777 /dev/shm/php-fcgi.sock ls -al /dev/shm/php-fcgi.sock top journalctl -xe vim /etc/systemd/system/obfs-server.service systemctl daemon-reload systemctl restart obfs-server
1)对称加密算法:就是加密和解密使用同一个密钥的加密算法。因为加密方和解密方使用的密钥相同,所以称为称为对称加密,也称为单钥加密方法。
优点是:加密和解密运算速度快,所以对称加密算法通常在消息发送方需要加密大量数据时使用;
缺点是:安全性差,如果一方的密钥遭泄露,那么整个通信就会被破解。另外加密之前双方需要同步密钥;
常用对称加密算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK、AES等;
2)非对称加密算法:而非对称加密算法需要两个密钥来进行加密和解密,这两个秘钥是公开密钥(public key,简称公钥)和私有密钥(private key,简称私钥)。
公钥和私钥是一对:公钥用来加密,私钥解密,而且公钥是公开的,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
优点是:安全性更好,私钥是自己保存的,不需要像对称加密那样在通信之前要先同步秘钥。
缺点是:加密和解密花费时间长、速度慢,只适合对少量数据进行加密。
常用的非对称加密算法有:RSA、Elgamal、Rabin、D-H、ECC等;
3)HASH算法:也称为消息摘要算法。将任意长度的二进制值映射为较短的固定长度的二进制值,该二进制值称为哈希值。
常用于检验数据的完整性,检验数据没有被篡改过。常见的又 MD5(MD系列),SHA-1(SHA系列)
首先,HTTP 是一个网络协议,是专门用来帮你传输 Web 内容滴。关于这个协议,就算你不了解,至少也听说过吧?比如访问百度主页,浏览器地址栏会出现如下的网址
http://www.baidu.com/
俺加了粗体的部分就是指 HTTP 协议。大部分网站都是通过 HTTP 协议来传输 Web 页面、以及 Web 页面上包含的各种东东(图片、CSS 样式、JS 脚本)。
2.1. HTTP 的版本和历史
如今咱们用的 HTTP 协议,版本号是 1.1(也就是 HTTP 1.1)。这个 1.1 版本是1995年底开始起草的(技术文档是 RFC2068),并在1999年正式发布(技术文档是 RFC2616)。
在 1.1 之前,还有曾经出现过两个版本“0.9 和 1.0”,其中的 HTTP 0.9 【没有】被广泛使用,而 HTTP 1.0 被广泛使用过。
另外,2015年 IETF 发布了 HTTP 2.0 (技术文档是 RFC7540)
2.2. HTTP 和 TCP 之间的关系
简单地说,TCP 协议是 HTTP 协议的基石——HTTP 协议需要依靠 TCP 协议来传输数据。
在网络分层模型中,TCP 被称为“传输层协议”,而 HTTP 被称为“应用层协议”。有很多常见的应用层协议是以 TCP 为基础的,比如“FTP、SMTP、POP、IMAP”等。
TCP 被称为“面向连接”的传输层协议。关于它的具体细节,俺就不展开了(否则篇幅又失控了)。你只需知道:传输层主要有两个协议,分别是 TCP 和 UDP。TCP 比 UDP 更可靠。你可以把 TCP 协议想象成某个水管,发送端这头进水,接收端那头就出水。并且 TCP 协议能够确保,先发送的数据先到达(与之相反,UDP 不保证这点)。
2.3. HTTP 协议如何使用 TCP 连接?
HTTP 对 TCP 连接的使用,分为两种方式:俗称“短连接”和“长连接”(“长连接”又称“持久连接”,洋文叫做“Keep-Alive”或“Persistent Connection”)
假设有一个网页,里面包含好多图片,还包含好多【外部的】CSS 文件和 JS 文件。在“短连接”的模式下,浏览器会先发起一个 TCP 连接,拿到该网页的 HTML 源代码(拿到 HTML 之后,这个 TCP 连接就关闭了)。然后,浏览器开始分析这个网页的源码,知道这个页面包含很多外部资源(图片、CSS、JS)。然后针对【每一个】外部资源,再分别发起一个个 TCP 连接,把这些文件获取到本地(同样的,每抓取一个外部资源后,相应的 TCP 就断开)
相反,如果是“长连接”的方式,浏览器也会先发起一个 TCP 连接去抓取页面。但是抓取页面之后,该 TCP 连接并不会立即关闭,而是暂时先保持着(所谓的“Keep-Alive”)。然后浏览器分析 HTML 源码之后,发现有很多外部资源,就用刚才那个 TCP 连接去抓取此页面的外部资源。
在 HTTP 1.0 版本,【默认】使用的是“短连接”(那时候是 Web 诞生初期,网页相对简单,“短连接”的问题不大);
到了1995年底开始制定 HTTP 1.1 草案的时候,网页已经开始变得复杂(网页内的图片、脚本越来越多了)。这时候再用短连接的方式,效率太低下了(因为建立 TCP 连接是有“时间成本”和“CPU 成本”滴)。所以,在 HTTP 1.1 中,【默认】采用的是“Keep-Alive”的方式。
关于“Keep-Alive”的更多介绍,可以参见维基百科词条(在“这里”)
SSL 是洋文“Secure Sockets Layer”的缩写,中文叫做“安全套接层”。它是在上世纪90年代中期,由网景公司设计的。(顺便插一句,网景公司不光发明了 SSL,还发明了很多 Web 的基础设施——比如“CSS 样式表”和“JS 脚本”)
为啥要发明 SSL 这个协议捏?因为原先互联网上使用的 HTTP 协议是明文的,存在很多缺点——比如传输内容会被偷窥(嗅探)和篡改。发明 SSL 协议,就是为了解决这些问题。
到了1999年,SSL 因为应用广泛,已经成为互联网上的事实标准。IETF 就在那年把 SSL 标准化。标准化之后的名称改为 TLS(是“Transport Layer Security”的缩写),中文叫做“传输层安全协议”。
很多相关的文章都把这两者并列称呼(SSL/TLS),因为这两者可以视作同一个东西的不同阶段。
1994年,NetScape公司设计了SSL协议(Secure Sockets Layer)的1.0版,但是未发布。 1995年,NetScape公司发布SSL 2.0版,很快发现有严重漏洞。 1996年,SSL 3.0版问世,得到大规模应用。 1999年,互联网标准化组织ISOC接替NetScape公司,发布了SSL的升级版TLS 1.0版。 2006年和2008年,TLS进行了两次升级,分别为TLS 1.1版和TLS 1.2版。最新的变动是2011年TLS 1.2的修订版。
目前,应用最广泛的是TLS 1.0,接下来是SSL 3.0。但是,主流浏览器都已经实现了TLS 1.2的支持。
TLS 1.0通常被标示为SSL 3.1,TLS 1.1为SSL 3.2,TLS 1.2为SSL 3.3。
数字证书 里面存放了公钥,(采用数字证书是为了防止别人篡改非对称加密算法的公钥,保证公钥的可信)具体可参见密码和证书-https(ssl/tls)之证书的概述及获取和网站部署
HTTPS其实是有两部分组成:HTTP + SSL / TLS,也就是在HTTP上又加了一层处理加密信息的模块。服务端和客户端的信息传输都会通过SSL / TLS进行加密,所以传输的数据都是加密后的数据。
不使用SSL/TLS的HTTP通信,就是不加密的通信。所有信息明文传播,带来了三大风险。
(1) 窃听风险(eavesdropping):第三方可以获知通信内容。 (2) 篡改风险(tampering):第三方可以修改通信内容。 (3) 冒充风险(pretending):第三方可以冒充他人身份参与通信。
SSL/TLS协议是为了解决这三大风险而设计的,希望达到:
(1) 所有信息都是加密传播,第三方无法窃听。 (2) 具有校验机制,一旦被篡改,通信双方会立刻发现。 (3) 配备身份证书,防止身份被冒充。
互联网是开放环境,通信双方都是未知身份,这为协议的设计带来了很大的难度。而且,协议还必须能够经受所有匪夷所思的攻击,这使得SSL/TLS协议变得异常复杂。
花了好多口水,终于把背景知识说完了。下面正式进入正题。先来说说当初设计 HTTPS 是为了满足哪些需求?
很多介绍 HTTPS 的文章一上来就给你讲实现细节。个人觉得:这是不好的做法。早在2009年开博的时候,发过一篇《学习技术的三部曲:WHAT、HOW、WHY》,其中谈到“WHY 型问题”的重要性。一上来就给你讲协议细节,你充其量只能知道 WHAT 和 HOW,无法理解 WHY。俺在前一个章节讲了“背景知识”,在这个章节讲了“需求”,这就有助于你理解:当初为什么要设计成这样?——这就是 WHY 型的问题。
因为是先有 HTTP 再有 HTTPS。所以,HTTPS 的设计者肯定要考虑到对原有 HTTP 的兼容性。
这里所说的兼容性包括很多方面。比如已有的 Web 应用要尽可能无缝地迁移到 HTTPS;比如对浏览器厂商而言,改动要尽可能小;……
基于“兼容性”方面的考虑,很容易得出如下几个结论:
1. HTTPS 还是要基于 TCP 来传输
(如果改为 UDP 作传输层,无论是 Web 服务端还是浏览器客户端,都要大改,动静太大了)
2. 单独使用一个新的协议,把 HTTP 协议包裹起来
(所谓的“HTTP over SSL”,实际上是在原有的 HTTP 数据外面加了一层 SSL 的封装。HTTP 协议原有的 GET、POST 之类的机制,基本上原封不动)
打个比方:如果原来的 HTTP 是塑料水管,容易被戳破;那么如今新设计的 HTTPS 就像是在原有的塑料水管之外,再包一层金属水管。一来,原有的塑料水管照样运行;二来,用金属加固了之后,不容易被戳破。
前面说了,HTTPS 相当于是“HTTP over SSL”。
如果 SSL 这个协议在“可扩展性”方面的设计足够牛逼,那么它除了能跟 HTTP 搭配,还能够跟其它的应用层协议搭配。岂不美哉?
现在看来,当初设计 SSL 的人确实比较牛。如今的 SSL/TLS 可以跟很多常用的应用层协议(比如:FTP、SMTP、POP、Telnet)搭配,来强化这些应用层协议的安全性。
接着刚才打的比方:如果把 SSL/TLS 视作一根用来加固的金属管,它不仅可以用来加固输水的管道,还可以用来加固输煤气的管道。
HTTPS 需要做到足够好的保密性。
说到保密性,首先要能够对抗嗅探(行话叫 Sniffer)。所谓的“嗅探”,通俗而言就是监视你的网络传输流量。如果你使用明文的 HTTP 上网,那么监视者通过嗅探,就知道你在访问哪些网站的哪些页面。
嗅探是最低级的攻击手法。除了嗅探,HTTPS 还需要能对抗其它一些稍微高级的攻击手法——比如“重放攻击”(后面讲协议原理的时候,会再聊)。
除了“保密性”,还有一个同样重要的目标是“确保完整性”。关于“完整性”这个概念,在之前的博文《扫盲文件完整性校验——关于散列值和数字签名》中大致提过。健忘的同学再去温习一下。
在发明 HTTPS 之前,由于 HTTP 是明文的,不但容易被嗅探,还容易被篡改。
举个例子:
比如咱们天朝的网络运营商(ISP)都比较流氓,经常有网友抱怨说访问某网站(本来是没有广告的),竟然会跳出很多中国电信的广告。为啥会这样捏?因为你的网络流量需要经过 ISP 的线路才能到达公网。如果你使用的是明文的 HTTP,ISP 很容易就可以在你访问的页面中植入广告。
所以,当初设计 HTTPS 的时候,还有一个需求是“确保 HTTP 协议的内容不被篡改”。
在谈到 HTTPS 的需求时,“真实性”经常被忽略。其实“真实性”的重要程度不亚于前面的“保密性”和“完整性”。
举个例子:
你因为使用网银,需要访问该网银的 Web 站点。那么,你如何确保你访问的网站确实是你想访问的网站?(这话有点绕口令)
有些天真的同学会说:通过看网址里面的域名,来确保。为啥说这样的同学是“天真的”?因为 DNS 系统本身是不可靠的(尤其是在设计 SSL 的那个年代,连 DNSSEC 都还没发明)。由于 DNS 的不可靠(存在“域名欺骗”和“域名劫持”),你看到的网址里面的域名【未必】是真实滴!
(不了解“域名欺骗”和“域名劫持”的同学,可以参见俺之前写的《扫盲 DNS 原理,兼谈“域名劫持”和“域名欺骗/域名污染”》)
所以,HTTPS 协议必须有某种机制来确保“真实性”的需求(至于如何确保,后面会细聊)。
再来说最后一个需求——性能。
引入 HTTPS 之后,【不能】导致性能变得太差。否则的话,谁还愿意用?
为了确保性能,SSL 的设计者至少要考虑如下几点:
1. 如何选择加密算法(“对称”or“非对称”)?
2. 如何兼顾 HTTP 采用的“短连接”TCP 方式?
(SSL 是在1995年之前开始设计的,那时候的 HTTP 版本还是 1.0,默认使用的是“短连接”的 TCP 方式——默认不启用 Keep-Alive)
以上就是设计 SSL 协议时,必须兼顾的各种需求。后面聊协议的实现时,俺会拿 SSL 协议的特点跟前面的需求作对照。看看这些需求是如何一一满足滴。
设计 HTTPS 这个协议,有好几个难点。俺个人认为最大的难点在于“密钥交换”。
在传统的密码学场景中,假如张三要跟李四建立一个加密通讯的渠道,双方事先要约定好使用哪种加密算法?同时也要约定好使用的密钥是啥?在这个场景中,加密算法的【类型】让旁人知道,没太大关系。但是密钥【千万不能】让旁人知道。一旦旁人知道了密钥,自然就可以破解通讯的密文,得到明文。
好,现在回到 HTTPS 的场景。
当你访问某个公网的网站,你的浏览器和网站的服务器之间,如果要建立加密通讯,必然要商量好双方使用啥算法,啥密钥。——在网络通讯术语中,这个过程称之为“握手/handshake”。在握手阶段,因为加密方式还没有协商好,所以握手阶段的通讯必定是【明文】滴!既然是明文,自然有可能被第三方偷窥到。然后,还要考虑到双方之间隔着一个互联网,什么样的偷窥都可能发生。
因此,在握手的过程中,如何做到安全地交换密钥信息,而不让周围的第三方看到。这就是设计 HTTPS 最大的难点。
本文费这么多口水,来介绍 HTTPS 的“需求”和“难点”,为啥捏?因为只有当你了解这些,后面介绍 SSL/TLS 的实现原理时,你才能理解——当初为啥要把协议设计成这个样子。
1)利用对称加密算法来加密网页内容,那么如何保证对称加密算法的秘钥的安全呢?
2)使用非对称加密算法来获得对称加密算法的秘钥,从而保证了对称加密算法的秘钥的安全,也就保证了对称加密算法的安全。
这里这样安排使用的原理是,利用了对称加密算法和非对称加密算法优点,而避免了它们的缺点。利用了对称加密算法速度快,而非对称加密算法安全的优点;同时巧妙的避免了对称加密算法的不安全性,以及需要同步密钥的缺点,也避免了非对称加密算法的速度慢的缺点。实在是巧妙了。
这里有两个问题:
(1)如何保证非对称加密算法公钥不被篡改?
解决方法:将公钥放在数字证书中。只要证书是可信的,公钥就是可信的。
(2)公钥加密计算量太大,如何减少耗用的时间?
解决方法:每一次对话(session),客户端和服务器端都生成一个”对话密钥”(session key),用它来加密信息。由于”对话密钥”是对称加密算法,所以运算速度非常快,而服务器公钥只用于加密”对话密钥”本身,这样就减少了加密运算的消耗时间。(也就是网页内容的加密使用的是对称加密算法)
因此,SSL/TLS协议的基本过程是这样的:
(1) 客户端向服务器端索要并验证非对称加密算法的公钥。
(2) 双方协商生成对称加密算法的”对话密钥”。
(3) 双方采用对称加密算法和它的”对话密钥”进行加密通信。
上面过程的前两步,又称为”握手阶段”(handshake)。
大白话说明一下:
第一步,爱丽丝给出协议版本号、一个客户端生成的随机数(Client random),以及客户端支持的加密方法。
第二步,鲍勃确认双方使用的加密方法,并给出数字证书、以及一个服务器生成的随机数(Server random)。
第三步,爱丽丝确认数字证书有效,然后生成一个新的随机数(Premaster secret),并使用数字证书中的公钥,加密这个随机数,发给鲍勃。
第四步,鲍勃使用自己的私钥,获取爱丽丝发来的随机数(即Premaster secret)。
第五步,爱丽丝和鲍勃根据约定的加密方法,使用前面的三个随机数,生成”对话密钥”(session key),用来加密接下来的整个对话过程。
“握手阶段”涉及四次通信:
1) 客户端发出请求(ClientHello)
首先,客户端(通常是浏览器)先向服务器发出加密通信的请求,这被叫做ClientHello请求。在这一步,客户端主要向服务器提供以下信息:
(1)浏览器支持的SSL/TLS协议版本,比如TLS 1.0版。 (2)一个浏览器客户端生成的随机数,稍后用于生成对称加密算法的"对话密钥"。 (3)浏览器支持的各种加密方法,对称的,非对称的,HASH算法。比如RSA非对称加密算法,DES对称加密算法,SHA-1 hash算法。 (4)浏览器支持的压缩方法。
这里需要注意的是,客户端发送的信息之中不包括服务器的域名。也就是说,理论上服务器只能包含一个网站,否则会分不清应该向客户端提供哪一个网站的数字证书。
这就是为什么通常一台服务器只能有一张数字证书的原因。
对于虚拟主机的用户来说,这当然很不方便。2006年,TLS协议加入了一个Server Name Indication扩展[ 即 SNI 扩展],允许客户端向服务器提供它所请求的域名。
2) 服务器回应(SeverHello)
服务器收到客户端请求后,向客户端发出回应,这叫做SeverHello。服务器的回应包含以下内容:
(1)确认使用的加密通信协议版本,比如TLS 1.0版本。如果浏览器与服务器支持的版本不一致,服务器关闭加密通信。 (2)一个服务器生成的随机数,稍后用于生成"对话密钥"。 (3)确认使用的加密方法,比如RSA公钥加密。 (4)服务器证书。
除了上面这些信息,如果服务器需要确认客户端的身份,就会再包含一项请求,要求客户端提供”客户端证书”。比如,金融机构往往只允许认证客户连入自己的网络,就会向正式客户提供USB密钥【俗称K宝】,里面就包含了一张客户端证书。
3) 客户端回应
客户端收到服务器回应以后,首先验证服务器证书。如果证书不是可信机构颁布、或者证书中的域名与实际域名不一致、或者证书已经过期,就会向访问者显示一个警告,由其选择是否还要继续通信。
如果证书没有问题,客户端就会从证书中取出服务器的非对称加密算法的公钥。然后,向服务器发送下面三项信息。
(1)一个随机数。该随机数用服务器公钥加密,防止被窃听。 (2)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。 (3)客户端握手结束通知,表示客户端的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供服务器校验。
上面第一项的随机数,是整个握手阶段出现的第三个随机数,又称”pre-master key”。有了它以后,客户端和服务器就同时有了三个随机数,接着双方就用事先商定的加密方法,各自生成本次会话所用的同一把”会话密钥”。
至于为什么一定要用三个随机数,来生成”会话密钥”,dog250解释得很好:
“不管是客户端还是服务器,都需要随机数,这样生成的密钥才不会每次都一样。由于SSL协议中证书是静态的,因此十分有必要引入一种随机因素来保证协商出来的密钥的随机性。
对于RSA密钥交换算法来说,pre-master-key本身就是一个随机数,再加上hello消息中的随机,三个随机数通过一个密钥导出器最终导出一个对称密钥。
pre master的存在在于SSL协议不信任每个主机都能产生完全随机的随机数,如果随机数不随机,那么pre master secret就有可能被猜出来,那么仅适用pre master secret作为密钥就不合适了,因此必须引入新的随机因素,那么客户端和服务器加上pre master secret三个随机数一同生成的密钥就不容易被猜出了,一个伪随机可能完全不随机,可是是三个伪随机就十分接近随机了,每增加一个自由度,随机性增加的可不是一。”
此外,如果前一步,服务器要求客户端证书,客户端会在这一步发送证书及相关信息。
4) 服务器的最后回应
服务器收到客户端的第三个随机数pre-master key之后,计算生成本次会话所用的对称加密算法的”会话密钥”。然后,向客户端最后发送下面信息。
(1)编码改变通知,表示随后的信息都将用双方商定的加密方法和密钥发送。 (2)服务器握手结束通知,表示服务器的握手阶段已经结束。这一项同时也是前面发送的所有内容的hash值,用来供客户端校验。
至此,整个握手阶段全部结束。接下来,客户端与服务器进入加密通信,就完全是使用普通的HTTP协议,只不过用”会话密钥”加密内容。
握手阶段用来建立SSL连接。如果出于某种原因,对话中断,就需要重新握手。
这时有两种方法可以恢复原来的session:
一种叫做session ID:
session ID的思想很简单,就是每一次对话都有一个编号(session ID)。如果对话中断,下次重连的时候,只要客户端给出这个编号,且服务器有这个编号的记录,双方就可以重新使用已有的”对话密钥”,而不必重新生成一把。
客户端给出session ID,服务器确认该编号存在,双方就不再进行握手阶段剩余的步骤,而直接用已有的对话密钥进行加密通信。
另一种叫做session ticket:
session ID是目前所有浏览器都支持的方法,但是它的缺点在于session ID往往只保留在一台服务器上。所以,如果客户端的请求发到另一台服务器,就无法恢复对话。session ticket就是为了解决这个问题而诞生的,目前只有Firefox和Chrome浏览器支持。
客户端不再发送session ID,而是发送一个服务器在上一次对话中发送过来的session ticket。这个session ticket是加密的,只有服务器才能解密,其中包括本次对话的主要信息,比如对话密钥和加密方法。当服务器收到session ticket以后,解密后就不必重新生成对话密钥了。
本文如果结合 HTTPS连接的前几毫秒发生了什么 一起来理解HTTPS,将理解的更加深入。
1)HTTPS 结合使用了 非对称加密算法,对称加密算法,hash算法,分别利用他们的优势,避免他们的缺点。利用非对称加密算法获得对称加密算法的秘钥,保证他的安全性;然后实际的网页内容的加密使用的是对称加密算法,利用了对称加密算法速度快的优势,hash算法主要是防止篡改的发生,是一种校验机制,最后数字证书,保证了服务器在将非对称加密算法的公钥传给浏览器时的安全性(不会被中间人篡改),同时也标志了服务器的身份。
2)HTTPS的四大金刚:
非对称加密算法(对称加密算法的秘钥) + 对称加密算法(加密内容) + 数字证书(防止篡改非对称加密算法的公钥) + HASH算法(防止篡改消息)== HTTPS
3)HTTPS的本质是什么?
HTTPS的本质就是在HTTP连接发起之前,先使用SSL/TLS协议,协调客户端和服务端,在两端各自生产一个对称加密算法的秘钥,然后使用普通的HTTP协议传输 经过对称加密算法加密的网页内容。因为对称加密算法的秘钥是安全的,所以对称加密算法加密的网页内容也是安全的。
参考:
http://www.ruanyifeng.com/blog/2014/02/ssl_tls.html
https://www.cnblogs.com/digdeep/p/4832885.html
http://www.ruanyifeng.com/blog/2014/09/illustration-ssl.html
https://program-think.blogspot.com/2014/11/https-ssl-tls-1.html
1、密码和证书-https(ssl/tls)之证书的概述及获取和网站部署 ,使网站能够通过https访问。
2、配置服务器,将网站从 http 跳转到 https。
### nginx 服务器 http 跳转 https 的配置如下 server { listen 80; server_name www.huaijiujia.com; return 301 https://www.huaijiujia.com$request_uri; }
# 添加下面这句话,使php网站 从 http 强制跳转到 https define('FORCE_SSL_ADMIN', true);
If that worked fine, now it’s time to do the last few steps to complete the transfer to HTTPS:
参考自:https://websitesetup.org/http-to-https-wordpress/#comment-131467
8.1 请考虑介绍下常用于SPDY的HTTPS falst start握手,它比标准的握手少一个“server finished”的步骤。经过debug测试,发现SPDY+HTTPS false start握手确实比标准的SSL/TLS少一次握手,最后一次服务器到客户端的握手是没有的,第一次Finished后就可以传输数据了。
8.2 第三个随机数客户端是用公钥加密的然后在发送给服务端,服务端用私钥解密获取随机数。客户端和服务端用约定加密方法使用三个随机数生成对话密钥。
8.3 整个握手阶段都不加密(也没法加密),都是明文的。因此,如果有人窃听通信,他可以知道双方选择的加密方法,以及三个随机数中的两个。整个通话的安全,只取决于第三个随机数(Premaster secret)能不能被破解。
虽然理论上,只要服务器的公钥足够长(比如2048位),那么Premaster secret可以保证不被破解。但是为了足够安全,我们可以考虑把握手阶段的算法从默认的RSA算法,改为 Diffie-Hellman算法(简称DH算法)。
采用DH算法后,Premaster secret不需要传递,双方只要交换各自的参数,就可以算出这个随机数。