nodehttp2的example内有http/2服务器(server.js)和客户端(client.js)的的代码案例。其中的server.js 提供了一个简单的http/2服务器代码模板。node
http/2的一个特色,就是流量走向了TLS,也就是走了加密信道。http 1.x都是明文的,文本化的,机器可读人也可读,调试和差错都比较容易,编码也不难。虽然你们一再说为了性能的提高,http2的性能也确实有很大的提高,而后走向TLS终究让不少人感到不快。git
正如 微博网友 @Livid 说:golang
愈来愈多的网络流量 TLS 化实际上是一件挺悲哀的事情。就像现实生活中,若是愈来愈多的地方的入口 (机场,地铁,甚至办公楼)须要安检,那其实并非一件让人愉快的事情。 1. 最先的一切互联网协议,都是由一群很是善良的人设计的。这些协议在一个完美的环境里能够完美工做。 2. 可是这个世界是不完美的。很是不完美。因而,从某个时间点开始,进入到某种攻防游戏中。 全网流量的 TLS 化是第一步。
理论上说,尽管http/2 能够在plain TCP上跑,可是不管chrome,仍是firefox都仅仅选择实现了TLS的。抛开这些朦胧的伤感,TLS也是必然的现实,不如咱们去面对它。chrome
到底TLS过程是怎样的?我想用openssl,从外部来看node-http2这个黑盒。浏览器
TLS须要证书,这是一个显著的和前些版本的差异。正规的证书,须要第三方发布,而且是比较权威的第三方,期间的过程也须要有些纸质的证实文件的往来。固然也得缴费,且极可能价值不菲。这个东西是用来证实服务器身份的,在那个地方,是谁的等等。固然不能你本身所说就算的。服务器
还好,CA们仍是网开一面。若是只是测试,咱们能够作自签名证书。特色就是证书内的Issuer(签署人),subject(被证实人)都是一我的。典型的作法,就是使用openssl来作(刚刚发现Windows7自带openssl:)。网络
$ openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 101 -nodes Generating a 2048 bit RSA private key ...........+++ ......+++ writing new private key to 'key.pem' ----- You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- Country Name (2 letter code) [AU]:CN // 国家码 State or Province Name (full name) [Some-State]:SC//地区码 Locality Name (eg, city) []:localcity// 本地码 Organization Name (eg, company) [Internet Widgits Pty Ltd]:sanrex // 公司名称 Organizational Unit Name (eg, section) []:trd // 部门 Common Name (eg, YOUR name) []:samwise// 名字 Email Address []:frodo@gmail.com //邮箱
$node example\server.js
$openssl s_client -connect localhost:8080
λ openssl s_client -connect localhost:8080 CONNECTED(00000003) depth=0 /C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com verify error:num=18:self signed certificate// 这里也指明了是自签名证书,是不被广大浏览器信任的 verify return:1 depth=0 /C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com verify return:1 --- Certificate chain // 自签名,固然s(subject),i(issuer)是同样的 0 s:/C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com i:/C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com --- Server certificate// 这个证书,和我服务器生成的证书是同样的 -----BEGIN CERTIFICATE----- MIIEejCCA2KgAwIBAgIJAMOercExD57pMA0GCSqGSIb3DQEBBQUAMIGEMQswCQYD VQQGEwJDTjELMAkGA1UECBMCU0MxEDAOBgNVBAcTB2NoZW5nZHUxDzANBgNVBAoT BnNhbnJleDEMMAoGA1UECxMDdHJkMRQwEgYDVQQDEwtsaXVjaHVhbmp1bjEhMB8G CSqGSIb3DQEJARYSMTAwMGNvcHlAZ21haWwuY29tMB4XDTE1MDQyMTAyMDQwN1oX DTE1MDczMTAyMDQwN1owgYQxCzAJBgNVBAYTAkNOMQswCQYDVQQIEwJTQzEQMA4G A1UEBxMHY2hlbmdkdTEPMA0GA1UEChMGc2FucmV4MQwwCgYDVQQLEwN0cmQxFDAS BgNVBAMTC2xpdWNodWFuanVuMSEwHwYJKoZIhvcNAQkBFhIxMDAwY29weUBnbWFp bC5jb20wggEiMA0GCSqGSIb3DQEBAQUAA4IBDwAwggEKAoIBAQDOkaP2DnPPRLUw wOFQNj4LIPkdha/kn5Aql8nauM8a5nneZO876fF3JT7q7Lq1jtgWhlQgljLywB40 +/qrge6lrVLQN3r+BiKFoHJlTR0HFOhtb2fwUV3bA4mrvLIUJgGflvBGR4BSjTZ8 CkSZYWlNAxztPDFi8wY6CpCJlSU3jaAoqYvBJdjT1lCnTvt5X5tPzs69PqSlPzcL AVOEcIehJ27LHMv6f73IMhi7BOK5tuphn8Aff0+VmE8SCesMi4Jy+OiRcXHiPJWp GPHVOMmnCCyzZZtSg81frBtqSPmnN3lcOpQgFeooIzRBpWZx210v8JDiLFebzz1F YTNebrXtAgMBAAGjgewwgekwHQYDVR0OBBYEFKCAOSe0ra1/SrzfFYLRpdvDVlur MIG5BgNVHSMEgbEwga6AFKCAOSe0ra1/SrzfFYLRpdvDVluroYGKpIGHMIGEMQsw CQYDVQQGEwJDTjELMAkGA1UECBMCU0MxEDAOBgNVBAcTB2NoZW5nZHUxDzANBgNV BAoTBnNhbnJleDEMMAoGA1UECxMDdHJkMRQwEgYDVQQDEwtsaXVjaHVhbmp1bjEh MB8GCSqGSIb3DQEJARYSMTAwMGNvcHlAZ21haWwuY29tggkAw56twTEPnukwDAYD VR0TBAUwAwEB/zANBgkqhkiG9w0BAQUFAAOCAQEAc/zjXC/HXcLeAc0zr+y6ERzO 4HUitKzSFYa3j6OXn2K8X7X58hQOOsanfIuSI5eJjO8UrWoYoFdYBboIhGWHbEX9 m3GxIAmWLgXGddVYo+MI9dcABo6GlGZCZFNEuWv1Mfe9/DHi+jf0gOiiSwFRiRFR HZ3K7sXTVqAssE1VdZOZBTbZUkTBkI8QMcBC9zLhI3CMYgXYqt95/5w4y4MCuZJ8 4hZr1Swq+a4M7tzidQg6PD1Tacq8t9Be/IxCEvT1JJ+viulCDG2DDELMG1ZciZjb dygx46jLzSPlhorqsC38KcEIqMaUSQNwX686rLp2NVnvMeg3t8F7JlHamfd2YQ== -----END CERTIFICATE----- subject=/C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com issuer=/C=CN/ST=SC/L=localcity/O=sanrex/OU=trd/CN=samwise/emailAddress=frodo@gmail.com --- No client certificate CA names sent --- SSL handshake has read 1312 bytes and written 444 bytes --- New, TLSv1/SSLv3, Cipher is AES128-SHA Server public key is 2048 bit Compression: NONE Expansion: NONE SSL-Session: Protocol : TLSv1 Cipher : AES128-SHA Session-ID: 53D09139D2AF68CF254772FBA3C3133944C2F11CD451360E1C03ED54EDF5BAEA Session-ID-ctx: Master-Key: C19B36148B180EB26487873D575B73A0C4C763C1E07BD5571E9F35A7C5520C44AF423A5AEE4DE6F27D74C44CAC9D084C Key-Arg : None Start Time: 1429581989 Timeout : 300 (sec) Verify return code: 18 (self signed certificate) ---
以上过程,说明server.js是支持TLS的,也能够作了证书的传递和TLS handshake的。而不是只能和本身的client.js 玩的,这是一个开放的玩伴。性能