web服务器的域名格式(超详解读web服务器知识)(11/21)

来源:国外服务器 在您之前已被浏览:1 次
导读:目前正在解读《web服务器的域名格式(超详解读web服务器知识)(11/21)》的相关信息,《web服务器的域名格式(超详解读web服务器知识)(11/21)》是由用户自行发布的知识型内容!下面请观看由(国外主机 - www.2bp.net)用户发布《web服务器的域名格式(超详解读web服务器知识)(11/21)》的详细说明。
笨笨网美国主机,w ww.2 b p .n e t

eJet系统作为服务器端接收客户端HTTP请求和作为客户端向Origin服务器发送HTTP请求时,都会使用到SSL连接,调用OpenSSL的方法有一些差别。

eJet作为服务器端使用SSL时,使用OpenSSL的基本流程共有九个步骤。

初始化OpenSSL库

系统初始化时,首先调用SSL_library_init初始化OpenSSL库,调用SSL_add_ssl_algorithms()添加SSL缺省算法,加载错误信息定义串,如果根据SSL连接实例能获取到HTTPCon对象,需创建SSL连接索引,并利用该连接索引,将SSL Socket连接实例和HTTPCon对象关联。

配置证书和私钥

在系统配置Listen下,设置HTTPListen监听服务下是否支持SSL,及缺省的证书、私钥和CA证书,并在每个域名对应的虚拟主机下,配置启用SSL所需的服务器证书、私钥和CA证书。示例如下:

listen = { local ip = *; # any IP address port = 443; forward proxy = off; ssl = on; ssl certificate = cert.pem; ssl private key = cert.key; ssl ca certificate = cacert.pem; host = { host name = www.yunzhai.cn type = server; ssl certificate = yzcert.pem; ssl private key = yzcert.key; ssl ca certificate = yzcacert.pem;...... }......}

初始化SSL_Ctx

在系统初始化最后,开始启动HTTPListen服务前,加载监听服务和其下各虚拟主机时,分别根据证书、私钥和CA证书,创建HTTPListen的缺省SSL_Ctx实例,或创建各虚拟主机HTTPHost下的SSL_Ctx。

创建SSL_Ctx的过程先调用SSL_CTX_new创建实例,随后加载证书和私钥,并校验证书和私钥是否匹配,如果存在CA证书,还需加载CA证书。

最后,启用SNI(Server Name Indication)机制,设置一个回调函数来处理不同域名对应不同的证书和私钥,在SSL启动Handshake时,先发送ClientHello请求,其中携带了当前连接对应的域名,服务器端收到ClientHello时,会以域名为参数,调用回调函数,选择与之相对应的SSL_Ctx。

接受连接并创建SSL Socket

eJet服务器收到客户端的TCP连接请求时,创建HTTPCon实例,保存连接信息后,HTTPCon需关联HTTPListen,并根据HTTPListen中的ssl_link配置选项,来创建SSL Socket连接实例,其过程主要包括:使用SSL_new创建SSL实例,调用SSL_set_fd设置当前连接的文件描述符,调用SSL_set_ex_data将当前SSL对象和HTTPCon实例对象关联起来。最后,设置当前HTTPCon的ssl_handshaked状态为未建立握手状态。

根据域名选择对应的SSL_Ctx

一个监听端口下,可以有多个证书,用于不同的主机名,客户端HTTPS请求到达时,需要使用合适的证书来完成后续SSL握手和加密通信,这是采用TLS规范的SNI机制来实现的。

在创建SSL_Ctx时,需设置多域名选择的回调函数,SSL握手开始时的ClientHello请求携带请求的域名名称,回调函数根据SSL_get_servername获取到域名名称,在当前HTTPListen下查找该名称对应的虚拟主机HTTPHost,并调用SSL_set_SSL_CTX,将当前HTTPCon中的SSL连接的SSL_Ctx上下文实例设置为该HTTPHost下的sslctx,即可实现证书选择和切换操作。

SSL握手

对于接受客户端请求的情形,SSL握手过程是在SSL_accept中实现的,由于网络抖动等因素,握手过程中往来的数据需要通过多次读写事件来驱动完成,在http_pump处理IOE_READ和IOE_WRITE时,需要判断当前HTTPCon的ssl_handshaked状态,如果没有握手成功,则响应这两个ePump事件时,都需要调用SSL_accept。

eJet还需要根据SSL_accept的错误状态码,来添加对当前TCP连接的读就绪或写就绪监听处理,并在http_pump中处理读写事件。这是非阻塞通信下建立SSL连接必须要注意的步骤。

如果SSL_accept返回成功,则将HTTPCon的ssl_handshaked设置为已完成握手状态,并调用http_cli_recv来接收SSL上的数据。

在SSL连接上接收数据

eJet系统封装了一个针对HTTPCon的数据接收函数,同时兼容有SSL连接和没有SSL连接这两种情况,函数定义如下:

int http_con_read (void * vcon, frame_p frm, int * num, int * err);

ePump框架在当前连接有数据可读时,回调http_pump处理IOE_READ事件,如果完成了握手过程,则调用这个函数来读取数据。如果是SSL连接,该函数调用SSL_read来读取数据,如果读取成功,返回的是解密完成后的数据长度,并将解密后的数据存入缓冲区,注意:这里有两次拷贝(从内核拷贝到临时缓冲区,再从临时缓冲区拷贝到目标缓冲区),需要优化。

笨笨网美国主机,w ww.2 b p .n e t
提醒:《web服务器的域名格式(超详解读web服务器知识)(11/21)》最后刷新时间 2025-03-21 11:16:08,本站为公益型个人网站,仅供个人学习和记录信息,不进行任何商业性质的盈利。如果内容、图片资源失效或内容涉及侵权,请反馈至,我们会及时处理。本站只保证内容的可读性,无法保证真实性,《web服务器的域名格式(超详解读web服务器知识)(11/21)》该内容的真实性请自行鉴别。