如何从密钥文件判断是PKCS8还是PKCS1格式
不同的签名验签代码,对密钥格式有不同的要求:
比如JAVA一般使用PKCS8格式的密钥,其他语言一般使用PKCS1格式的密钥。
区分小技巧:
开头为"-----BEGIN PRIVATE KEY-----"的密钥格式为PKCS8,
开头为"-----BEGIN RSA PRIVATE KEY-----"的密钥格式为PKCS1
不同的签名验签代码,对密钥格式有不同的要求:
比如JAVA一般使用PKCS8格式的密钥,其他语言一般使用PKCS1格式的密钥。
开头为"-----BEGIN PRIVATE KEY-----"的密钥格式为PKCS8,
开头为"-----BEGIN RSA PRIVATE KEY-----"的密钥格式为PKCS1
http {
limit_conn_zone $binary_remote_addr zone=conn_zone:10m;
limit_req_zone $binary_remote_addr zone=req_zone:10m rate=1r/s;
# 其他配置
}
server {
listen 80;
server_name example.com;
# 限制单个客户端 IP 最大连接数为 2
limit_conn conn_zone 2;
# 限制单个客户端 IP 1s 内最多发起 1 个请求
limit_req zone=req_zone burst=5;
# 计算客户端 IP 累计请求流量,限制累计请求流量为 1GB
set $limit_rate 128k;
limit_rate_after 500M;
limit_rate 1m;
# 其他处理逻辑
}
#统计其他端口时:netstat -pnt | grep :xx | wc -l
netstat -pnt | grep :443 | wc -l
#服务器被恶意高频访问时可以用到
netstat -ant |awk '/:443/{split($5,ip,":");++A[ip[1]]}END{for(i in A) print A[i],i}' |sort -rn|head -n20
#如统计文件api_error.log中error关键词出现的次数
grep -o 'error' /www/payment/runtime/logs/api_error.log | wc -l
#可以监听整个文件,也可根据关键词监听
cd /www/payment/runtime/logs/
tail -f xxx.log #监听整个文件
tail -f xxx.log | grep 'xxx' #根据关键词监听
#以下是本人开发中常用到的
一、du命令
du命令是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的。
du -h filepath 直接得出人好识别的文件大小
du -h ljl.txt
或者
du -ah 当前目录下所有文件的大小
二、ls命令
ls命令用来显示目标列表,在Linux中是使用率较高的命令。ls命令的输出信息可以进行彩色加亮显示,以分区不同类型的文件。
ls -l filepath 第五列为文件字节数
ls -l ljl.txt
ls -h filepath h表示human, 加-h参数得到人好读的文件大小
ls -lh ljl.txt
#使用这个是为了查看异常登录地址
yum -y install whois
whois 119.53.224.203
df -h
ln -s [源文件或目录] [目标文件或目录]
例如:创建软链时,先进入根目录的bin目录下
cd /bin
从/bin这个路径创建软链nginx 引入/usr/local/nginx/sbin/nginx
ln -s /usr/local/nginx/sbin/nginx nginx
创建软链之后 重载nginx
就可以从 /usr/local/nginx/sbin/nginx -s reload 简化为 nginx -s reload
netstat -ant | grep 9000
#server模块中添加以下内容,修改完后,记得重启nginx
add_header Access-Control-Allow-Headers '*';
add_header Access-Control-Allow-Origin '*';
add_header Access-Control-Allow-Credentials 'true';
add_header Access-Control-Allow-Methods 'GET,POST,OPTIONS';
#跨域参数解释
#Access-Control-Allow-Origin:服务器默认是不被允许跨域的。给Nginx服务器配置Access-Control-Allow-Origin *后,表示服务器可以接受所有的请求源(Origin),即接受所有跨域的请求。
#Access-Control-Allow-Methods:允许通过的方法,可以防止Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息
#Access-Control-Allow-Credentials true 表示允许跨域请求携带 cookie
#Access-Control-Allow-Headers:为了防止出现Request header field Content-Type is not allowed by Access-Control-Allow-Headers in preflight response的错误信息。这个错误表示当前请求Content-Type的值不被支持。其实是我们发起了”application/json”的类型请求导致的
server {
listen 443 ssl;#监听443端口
#server_name 购买域名后解析到该服务器上,如果没有域名,也可以给此项目单独开端口
server_name api.applet.xxx.com;
root /xxx/xxxx/xxxx;#root 项目地址
index index.php index.html index.htm;#项目入口文件
#存放证书的地址.pem和.key文件
ssl_certificate /usr/local/nginx/conf/vhost/cert/xxx.pem;
ssl_certificate_key /usr/local/nginx/conf/vhost/cert/xxx.key;
ssl_session_timeout 5m;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:ECDHE:ECDH:AES:HIGH:!NULL:!aNULL:!MD5:!ADH:!RC4;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_prefer_server_ciphers on;
if (!-e $request_filename){
rewrite ^/(.*) /index.php last;
}
location ~ \.php$ {
fastcgi_pass 127.0.0.1:9000;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
include fastcgi_params;
}
error_log /var/log/nginx/api_applet.log error;
}
#这里讲到的是CentOS7,CentOS7的防火墙和CentOS6不一样了, CentOS 6 系列中的 iptables 相关命令不能用了,Centos7中使用firewalld代替了原来的iptables。
#停止firewall
systemctl stop firewalld.service
#禁止firewall开机启动
systemctl disable firewalld.service
#添加8022端口
firewall-cmd --zone=public --add-port=8022/tcp --permanent
#多个端口:
firewall-cmd --zone=public --add-port=80-90/tcp --permanent
#命令含义:
--zone #作用域
--add-port=8022/tcp #添加端口,格式为:端口/通讯协议
--permanent #永久生效,没有此参数重启后失效
#centos7查看防火墙所有信息
firewall-cmd --list-all
#centos7查看防火墙开放的端口信息
firewall-cmd --list-ports
#删除8022端口
firewall-cmd --zone=public --remove-port=8022/tcp --permanent
#重启防火墙
firewall-cmd --reload
常用命令介绍:
firewall-cmd --state ##查看防火墙状态,是否是running
firewall-cmd --reload ##重新载入配置,比如添加规则之后,需要执行此命令
firewall-cmd --get-zones ##列出支持的zone
firewall-cmd --get-services ##列出支持的服务,在列表中的服务是放行的
firewall-cmd --query-service ftp ##查看ftp服务是否支持,返回yes或者no
firewall-cmd --add-service=ftp ##临时开放ftp服务
firewall-cmd --add-service=ftp --permanent ##永久开放ftp服务
firewall-cmd --remove-service=ftp --permanent ##永久移除ftp服务
firewall-cmd --add-port=80/tcp --permanent ##永久添加80端口
HTTP 报文头也叫报文首部。
HTTP 头部字段是构成 HTTP 报文的要素之一。在客户端与服务器之间以 HTTP 协议进行通信的过程中,无论是请求还是响应都会使用头部字段,它能起到传递额外重要信息的作用。
HTTP 首部字段是由首部字段名和字段值构成的,中间用冒号:
分隔,下面是一个 HTTP 报文头的例子:
GET / HTTP/1.1
Host: hackr.jp
User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:13.0) Ge
Accept: text/html,application/xhtml+xml,application/xml;q=0
Accept-Language: ja,en-us;q=0.7,en;q=0.3
Accept-Encoding: gzip, deflate
Connection: keep-alive
If-Modified-Since: Fri, 31 Aug 2007 02:02:20 GMT
If-None-Match: "45bae1-16a-46d776ac"
Cache-Control: max-age=0
看不懂这些字段代表什么意思对吧?读完本文就全弄懂了。
通用首部字段是指:请求报文和响应报文双方都会使用的字段。
Cache-Control 通过设置不同的指令可以控制缓存的行为,指令格式为:
Cache-Control: no-cache
Cache-Control: no-store
Cache-Control: max-age=<seconds>
指令参数大概可以分为三类:
缓存时间<max-age
的数据。资源的过期时间<max-stale的值
。HTTP/1.1 版本的缓存服务器遇到同时存在 Expires 首部字段的情况时,会优先处理 max-age 指令,而忽略掉 Expires 首部字段。而 HTTP/1.0 版本的缓存服务器的情况却相反,max-age 指令会被忽略
禁止缓存:Cache-Control: no-store
缓存静态资源,例如图像,CSS 文件和 JavaScript 文件:
Cache-Control:public, max-age=31536000
需要重新验证
指定 no-cache 或 max-age=0, must-revalidate 表示客户端可以缓存资源,每次使用缓存资源前都必须重新验证其有效性。这意味着每次都会发起 HTTP 请求,但当缓存内容仍有效时可以跳过 HTTP 响应体的下载。
Cache-Control: no-cache 0
Cache-Control: max-age=0, must-revalidate
Connection 头(header)决定当前的事务完成后,是否会关闭网络连接。如果该值是 keep-alive
,网络连接就是持久的,不会关闭,使得对同一个服务器的请求可以继续在该连接上完成。
从 HTTP/1.1 版本开始,所有连接默认为持久连接。
表明 HTTP 报文的创建日期和时间。日期时间格式有好几种,这里列出一种常见格式:Mon, 06 Feb 2023 01:19:14 GMT
Pragma 是一个在 HTTP/1.0 中规定的通用首部,在 HTTP/1.1 协议被 Cache-Control 代替。现在它用来向后兼容只支持 HTTP/1.0 协议的缓存服务器。
Trailer 在分块传输编码时会被用到,它用来在消息块后面添加额外的元信息。
举个例子:下面的报文中 Trailer 指定了 Expires 字段,在消息块后面出现了 Expires 字段。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Content-Type: text/html
...
Transfer-Encoding: chunked
Trailer: Expires
...(报文主体)...
Expires: Tue, 28 Sep 2004 23:59:59 GMT
规定传输报文时采用的编码方式,可选的编码方式如下:
数据以一系列分块的形式进行发送。在每一个分块的开头需要添加当前分块的长度(十六进制),后面紧跟着 ‘\r\n’ ,之后是分块本身,后面也是’\r\n’ 。终止块是一个常规的分块,不同之处在于其长度为 0。
HTTP/1.1 200 OK
Date: Tue, 03 Jul 2012 04:40:56 GMT
Cache-Control: public, max-age=604800
Content-Type: text/javascript; charset=utf-8
Expires: Tue, 10 Jul 2012 04:40:56 GMT
X-Frame-Options: DENY
X-XSS-Protection: 1; mode=block
Content-Encoding: gzip
Transfer-Encoding: chunked
Connection: keep-alive
cf0\r\n ←16进制(10进制为3312)
3312字节数据\r\n
392\r\n ←16进制(10进制为914)
914字节数据\r\n
0\r\n
\r\n
采用 Lempel-Ziv-Welch (LZW) 压缩算法。这种内容编码方式已经被大部分浏览器弃用。
表示采用 Lempel-Ziv coding (LZ77) 压缩算法,以及 32 位 CRC 校验的编码方式。这个编码方式最初由 UNIX 平台上的 gzip 程序采用。处于兼容性的考虑,HTTP/1.1 标准提议支持这种编码方式的服务器应该识别作为别名的 x-gzip 指令。
用于表明自身未经过压缩和修改。
Transfer-Encoding 是一个逐跳传输消息首部,即仅应用于两个节点之间的消息传递。如果想要将压缩后的数据应用于整个连接,那么应该使用端到端传输消息首部 Content-Encoding 。
用于检测是否有可用的、更高版本的 HTTP 协议。
如果使用了 Upgrade 字段,Connection 字段的值会被指定为 Upgrade,比如:
Upgrade:TLS/1.0
Connection:Upgrade
Via 用于追踪客户端和服务器之间报文的传输路径,也可用于防止循环请求。格式:
Via: [ <protocol-name> "/" ] <protocol-version> <host> [ ":" <port> ]
or
Via: [ <protocol-name> "/" ] <protocol-version> <pseudonym>
警告报文出现了问题,格式:Warning: <warn-code> <warn-agent> <warn-text> [<warn-date>]
用来告知服务器可以处理的内容类型,例如:
Accept: <MIME_type>/<MIME_subtype>
Accept: <MIME_type>/*
Accept: */*
Accept: text/html, application/xhtml+xml, application/xml;q=0.9, */*;q=0.8
*
代表任意类型,比如 image/* 可以用来指代 image/png、image/svg、image/gif 以及任何其他的图片类型。用于声明客户端可以处理的字符集类型,例如:
Accept-Charset: <charset>
Accept-Charset: utf-8, iso-8859-1;q=0.5, *;q=0.1
用于声明客户端能够处理的编码方式,例如:
Accept-Encoding: deflate, gzip;q=1.0, *;q=0.5
用于声明客户端可以理解的语言,比如:
Accept-Language: <language>
Accept-Language: fr-CH, fr;q=0.9, en;q=0.8, de;q=0.7, *;q=0.5
用于提供给服务器验证身份的凭据,允许其访问受保护的资源,比如:
Authorization: <auth-scheme> <authorization-parameters>
Authorization: Basic YWxhZGRpbjpvcGVuc2VzYW1l
Basic 身份验证:首先将用户名和密码使用一个冒号拼接(username:password),然后将生成的字符串进行 base64 编码。
除了 Basic 编码方式,还有 Digest、Negotiate 等方式。
客户端发送带有 Expect 消息头的请求,等服务器回复后再发送消息体,例如:
Expect: 100-continue
服务器检查请求消息头,可能会返回一个状态码为 100 (Continue) 的回复来告知客户端继续发送消息体,也可能会返回一个状态码为 417 (Expectation Failed) 的回复来告知对方要求不能得到满足。
附带一个电子邮箱地址,例如:
From: webmaster@example.org
指明本次请求的目标服务器主机名和端口号。
形如 If-xxx 这种样式的请求首部字段,都可称为条件请求。服务器接收到附带条件的请求后,只有判断指定条件为真时,才会执行请求。 例如:
If-Match: "bfc13a64729c4290ef5b2c2730249c88ca92d82d"
服务器会比对 If-Match 的字段值和资源的 ETag 值,仅当两者一致时,才会执行请求。反之,则返回状态码 412 Precondition Failed 的响应。
If-Modified-Since 用于确认客户端拥有的本地资源的有效性,例如:
If-Modified-Since: Wed, 21 Oct 2015 07:28:00 GMT
服务器在收到带有 If-Modified-Since 字段的请求后,会将该字段值和资源更新时间做比较,若资源没有更新,则返回 304 状态码(Not Modified)。
与 If-Match 的作用相反。
If-Range HTTP 请求头字段用来使得 Range 头字段在一定条件下起作用:当字段值中的条件得到满足时,Range 头字段才会起作用,例如:
If-Range: Wed, 21 Oct 2015 07:28:00 GMT
字段值中既可以用 Last-Modified 时间值用作验证,也可以用 ETag 标记作为验证,但不能将两者同时使用。
与 If-Modified-Since 作用相反。
用于限制 TRACE 方法可经过的服务器(通常指代理服务器)数目。
发送包含首部字段 Max- Forwards 的请求时,该字段以十进制整数形式指定可经过的服务器最大数目。每经过一个服务器,Max-Forwards 的值减 1。当服务器接收到 Max-Forwards 值为 0 的请求时,则不再进行转发,而是直接返回响应。
用于客户端和代理服务器之间的认证,例如:
Proxy-Authorization: Basic dGlwOjkpNLAGfFY5
Range 字段用于分批请求资源,下面的示例表示请求获取从第 5001 字节至第 10000 字节的资源。
Range: bytes=5001-10000
接收到附带 Range 首部字段请求的服务器,会在处理请求之后返回状态码为 206 Partial Content 的响应。无法处理该范围请求时,则会返回状态码 200 OK 的响应及全部资源。
Referer 请求头包含了当前请求页面的来源页面的地址,即表示当前页面是通过此来源页面里的链接进入的。服务端一般使用 Referer 请求头识别访问来源,可能会以此进行统计分析、日志记录以及缓存优化等。
Referer 请求头可能暴露用户的浏览历史,涉及到用户的隐私问题,所以一般用于 HTTPS 协议。
表明客户端能够处理的传输编码方式及相对优先级,例如:
TE: gzip, deflate;q=0.5
User-Agent 首部包含了一个特征字符串,用来让网络协议的对端来识别发起请求的用户代理软件的应用类型、操作系统、软件开发商以及版本号。比如 Google 的 UA 字符串:
Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36
表明服务器是否支持范围请求,可以处理范围请求时指定字段值为 bytes,反之则为 none,指令格式:
Accept-Ranges: bytes
表明资源在代理服务器缓存了多久,以秒为单位,指令格式:
Age: 24
ETag 是资源的唯一标识符,使用 ETag 能快速确定资源是否发生过变化。(可以理解为资源的 “指纹”)
ETag 有强弱之分,资源即使发生了一丁点的变化也会改变强ETag值
,对应的,只有资源发生较大变化才会改变弱ETag值
,此时会在字段开始处附加 W/
:
ETag: W/"0815"
用于将页面重定向至新的地址,一般与 3xx 状态码配合使用,例如:
Location: <url>
Proxy-Authenticate 会把由代理服务器所要求的认证信息发送给客户端,例如:
Proxy-Authenticate: Basic realm="Access to the internal site"
用于告知客户端应该在多久之后再次发送请求。主要配合状态码 503 Service Unavailable,或 3xx Redirect 响应一起使用,例如:
Retry-After: 120(以秒为单位)
表明服务器的软件和版本信息,指令格式:
Server: Apache/2.2.6 (Unix) PHP/5.2.5
决定缓存能否使用,关于缓存,建议用 cache-control 而非 vary。
WWW-Authenticate 定义了应该使用何种验证方式去获取对资源的连接,例如服务器利用该字段规定了 Basic 认证 :
WWW-Authenticate: Basic realm="Access to the staging site"
WWW-Authenticate header 通常会和一个 401 Unauthorized 的响应一同被发送。
用于枚举资源所支持的 HTTP 方法的集合,指令格式:
Allow: GET, HEAD
如果 Allow 字段的值为空,说明资源不接受使用任何 HTTP 方法的请求,这可能是因为服务器需要临时禁止对资源的任何访问。
消息文本的编码类型,指令格式:
Content-Encoding: deflate, gzip
指令参数:
Content-Language 用来说明服务器希望访问者采用的语言或语言组合,例如报文的 Content-Language 字段值为 de
,那么说明这份文件是为说德语的人提供的,但是这并不意味着文本是德文,它也可能是英文等其他语言:
Content-Language: de
用于指明发送给客户端的消息主体
的大小,用十进制数字表示,例如:
Content-Length: 15900
对应资源的 URL。
用来表示一个数据片段在整个文件中的位置,例如:
Content-Range: bytes 200-1000/67589
用于告知客户端响应报文内容的内容类型,例如:
Content-Type: text/html; charset=utf-8
Content-Type: multipart/form-data; boundary=something
指令参数:
资源的 MIME 类型,比如 text/html、multipart/form-data。
字符编码标准。
用于告知客户端缓存的失效日期,指令格式:
Expires: Wed, 21 Oct 2015 07:28:00 GMT
如果在 Cache-Control 响应头设置了 max-age 或者 s-max-age 指令,那么 Expires 头会被忽略。
资源最后一次修改的时间,指令格式:
Last-Modified: Wed, 21 Oct 2015 07:28:00 GMT
服务器利用 Set-Cookie 字段来告知客户端 cookie,例如设置一个永久 cookie:
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT; Secure; HttpOnly
会话期 cookie
Set-Cookie: sessionId=38afes7a8
会话期 cookie 将会在客户端关闭时被移除。会话期 cookie 不设置 Expires 或 Max-Age 属性。
持久化 cookie
Set-Cookie: id=a3fWa; Expires=Wed, 21 Oct 2015 07:28:00 GMT
Set-Cookie: id=a3fWa; Max-Age=2592000
持久化 cookie 不会在客户端关闭时失效,而是在特定的日期(Expires)或者经过一段特定的时间之后(Max-Age)才会失效。
客户端在向服务器发 HTTP 请求时附带 Cookie 以获得服务器的认证。(Cookie 值来源于上文的 Set-Cookie 字段值)
一个 HTTP 请求要跨过多个代理服务器,经过多次代理服务器的转发才能到达目标服务器。
代理服务器做转发时,对原 HTTP 报文头部字段有两种处理方式:
哪些字段是逐条策略?哪些又是端到端策略?
除了下面这些字段为逐跳策略外,其他字段都属于端到端策略:
Location 指定的是一个重定向请求的目的地址(或者新创建的文件的 URL)。
Content-Location 指向的是可供访问的资源的直接地址。
Proxy-Authenticate 规定了客户端与代理服务器的认证方式,而 WWW-Authenticate 规定了客户端与服务器的认证方式。
Etag 由服务器端生成,客户端通过 If-Match 或者说 If-None-Match 这个条件判断请求来验证资源是否修改。常见的是使用 If-None-Match,比如请求一个文件的流程可能如下:
第一次请求:
第二次请求:
当首部字段 Cache-Control 有指定 max-age 指令时,会优先处理 max-age 指令,而忽略 Expires 字段。
参考:
enctype 属性规定在发送到服务器之前应该如何对表单数据进行编码。默认地,表单数据会编码为"application/x-www-form-urlencoded"。
(1)、HTTP 协议是以 ASCII 码 传输,建立在 TCP/IP 协议之上的应用层规范。规范把 HTTP 请求分为三个部分:状态行、请求头、消息主体。
(2)、协议规定 POST 提交的数据必须放在消息主体(entity-body)中,但协议并没有规定数据必须 使用什么编码方式 。实际上,开发者完全可以自己决定消息主体的格式,只要最后发送的 HTTP 请求满足上面的格式就可以。
(3)、数据发送出去,还要服务端解析成功才有意义。一般服务端语言如 php、python 等,以及它们的 framework,都内置了自动解析常见数据格式的功能。服务端通常是根据请求头(headers)中的 Content-Type 字段来获知请求中的消息主体是用何种方式编码,再对主体进行解析。
这应该是最常见的 POST 提交数据的方式了。浏览器的原生
X.509证书,其核心是根据RFC 5280编码或数字签名的数字文档。
实际上,术语X.509证书通常指的是IETF的PKIX证书和X.509 v3证书标准的CRL 文件,即如RFC 5280(通常称为PKIX for Public Key Infrastructure(X.509))中规定的。
我们首先要了解的是每种类型的文件扩展名。 很多人不清楚DER,PEM,CRT和CER结尾的文件是什么,更有甚者错误地说是可以互换的。 在某些情况下,某些可以互换,最佳做法是识别证书的编码方式,然后正确标记。 正确标签的证书将更容易操纵
.DER = DER扩展用于二进制DER编码证书。
这些文件也可能承载CER或CRT扩展。 正确的说法是“我有一个DER编码的证书”不是“我有一个DER证书”。
.PEM = PEM扩展用于不同类型的X.509v3文件,是以“ - BEGIN ...”前缀的ASCII(Base64)数据。
.CRT = CRT扩展用于证书。 证书可以被编码为二进制DER或ASCII PEM。 CER和CRT扩展几乎是同义词。 最常见的于Unix 或类Unix系统。
CER = .crt的替代形式(Microsoft Convention)您可以在微软系统环境下将.crt转换为.cer(.both DER编码的.cer,或base64 [PEM]编码的.cer)。
.cer文件扩展名也被IE识别为 一个运行MS cryptoAPI命令的命令(特别是rundll32.exe cryptext.dll,CryptExtOpenCER),该命令显示用于导入和/或查看证书内容的对话框。
.KEY = KEY扩展名用于公钥和私钥PKCS#8。 键可以被编码为二进制DER或ASCII PEM。
证书操作有四种基本类型。查看,转换,组合和提取。
即使PEM编码的证书是ASCII,它们是不可读的。这里有一些命令可以让你以可读的形式输出证书的内容;
openssl x509 -in cert.pem -text -noout
openssl x509 -in cert.cer -text -noout
openssl x509 -in cert.crt -text -noout
如果您遇到这个错误,这意味着您正在尝试查看DER编码的证书,并需要使用“查看DER编码证书”中的命令。
unable to load certificate
12626:error:0906D06C:PEMroutines:PEM_read_bio:no start line:pem_lib.c:647:Expecting: TRUSTEDCERTIFICATE
openssl x509 -in certificate.der -inform der -text -noout
如果您遇到以下错误,则表示您尝试使用DER编码证书的命令查看PEM编码证书。在“查看PEM编码的证书”中使用命令
unable to load certificate
13978:error:0D0680A8:asn1 encodingroutines:ASN1_CHECK_TLEN:wrong tag:tasn_dec.c:1306:
13978:error:0D07803A:asn1 encodingroutines:ASN1_ITEM_EX_D2I:nested asn1 error:tasn_dec.c:380:Type=X509
转换可以将一种类型的编码证书存入另一种。(即PEM到DER转换)
PEM到DER
openssl x509 -in cert.crt -outform der-out cert.der
DER到PEM
openssl x509 -in cert.crt -inform der -outform pem -out cert.pem
在某些情况下,将多个X.509基础设施组合到单个文件中是有利的。一个常见的例子是将私钥和公钥两者结合到相同的证书中。
组合密钥和链的最简单的方法是将每个文件转换为PEM编码的证书,然后将每个文件的内容简单地复制到一个新文件中。这适用于组合文件以在Apache中使用的应用程序。
一些证书将以组合形式出现。 一个文件可以包含以下任何一个:证书,私钥,公钥,签名证书,证书颁发机构(CA)和/或权限链。
还在为没有设置好Charles 抓不了手机上的https请求而苦恼吗!今天手把手教你用proxyman抓取iPhone上的网络请求
1.软件安装步骤我就省略了,软件下载地址: https://proxyman.io/
2.安装证书;Certificate->Install Certificate on this Mac
3.安装扩展以及证书,Automatic->Install&Trust Certificate
1.上面的步骤就安装好了证书;但是这个时候只能请求http,如果我们请求是https的话,执行下面步骤:
1.查看移动端设置流程,必须跟电脑连同一个Wi-Fi
2.根据上面5个步骤手机设置,注意⚠️第五步千万别遗漏了,这是你能否抓到数据等关键。
本文转自:https://www.jianshu.com/p/2e728bce7eba
感谢作者:剁椒先生
什么是大端?什么是小端?
主要针对的是CPU向内存写入数据的两种方式:
大端序:将高位字节保存在内存的低地址(高位字节在前)的方式。
小端序:将高位字节保存在内在存的高地址(低位字节在前)的方式。
假设在 0x20
号开始的地址中保存4字节 int
型数据 0x12345678
,大端序CPU
保存方式如下图所示:
上图1:整数 0x12345678
的大端序字节表示。
比如说1在高位就是高位字节,相反8就在低位是低位字节
对于大端序,最高位字节 0x12
存放到低位地址,最低位字节 0x78
存放到高位地址。小端序的保存方式如下图所示:
上图2:整数 0x12345678
的小端序字节表示。
比如说1在高位就是高位字节,相反8就在低位是低位字节
不同CPU
保存和解析数据的方式不同(主流的Intel
系列CPU
为小端序),小端序系统和大端序系统通信时会发生数据解析错误。因此在发送数据前,要将数据转换为统一的格式——网络字节序(Network Byte Order
)。网络字节序统一为大端序。主机A先把数据转换成大端序再进行网络传输,主机B收到数据后先转换为自己的格式再解析。网络字节序转换函数
在 sockaddr_in
结构体,其中就用到了网络字节序转换函数,如下所示:
//创建sockaddr_in结构体变量
struct sockaddr_in serv_addr;
memset(&serv_addr, 0, sizeof(serv_addr)); //每个字节都用0填充
serv_addr.sin_family = AF_INET; //使用IPv4地址
serv_addr.sin_addr.s_addr = inet_addr("127.0.0.1"); //具体的IP地址
serv_addr.sin_port = htons(1234); //端口号
htons()
用来将当前主机字节序转换为网络字节序,其中h
代表主机(host
)字节序,n
代表网络(network
)字节序,s
代表short
,htons
是 h、to、n、s
的组合,可以理解为”将short
型数据从当前主机字节序转换为网络字节序“。常见的网络字节转换函数有:htons()
:host to network short
,将short
类型数据从主机字节序转换为网络字节序。ntohs():network to host short
,将short
类型数据从网络字节序转换为主机字节序。htonl():host to network long
,将long
类型数据从主机字节序转换为网络字节序。ntohl():network to host long
,将long
类型数据从网络字节序转换为主机字节序。
通常,以s
为后缀的函数中,s
代表2个字节short
,因此用于端口号转换;以l
为后缀的函数中,l
代表4个字节的long
,因此用于IP
地址转换。举例说明上述函数的调用过程:
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(){
unsigned short host_port = 0x1234, net_port;
unsigned long host_addr = 0x12345678, net_addr;
net_port = htons(host_port);
net_addr = htonl(host_addr);
printf("Host ordered port: %#x\n", host_port);
printf("Network ordered port: %#x\n", net_port);
printf("Host ordered address: %#lx\n", host_addr);
printf("Network ordered address: %#lx\n", net_addr);
system("pause");
return 0;
}
运行结果:
Host ordered port: 0x1234
Network ordered port: 0x3412
Host ordered address: 0x12345678
Network ordered address: 0x78563412
另外需要说明的是,sockaddr_in
中保存IP地址的成员为32位整数,而我们熟悉的是点分十进制表示法,例如 127.0.0.1
,它是一个字符串,因此为了分配IP
地址,需要将字符串转换为4字节整数。inet_addr()
函数可以完成这种转换。inet_addr()
除了将字符串转换为32位整数,同时还进行网络字节序转换。请看下面的代码:
#include <stdio.h>
#include <stdlib.h>
#include <WinSock2.h>
#pragma comment(lib, "ws2_32.lib")
int main(){
char *addr1 = "1.2.3.4";
char *addr2 = "1.2.3.256";
unsigned long conv_addr = inet_addr(addr1);
if(conv_addr == INADDR_NONE){
puts("Error occured!");
}else{
printf("Network ordered integer addr: %#lx\n", conv_addr);
}
conv_addr = inet_addr(addr2);
if(conv_addr == INADDR_NONE){
puts("Error occured!");
}else{
printf("Network ordered integer addr: %#lx\n", conv_addr);
}
system("pause");
return 0;
}
运行结果:
Network ordered integer addr: 0x4030201
Error occured!
从运行结果可以看出,inet_addr()
不仅可以把IP地址转换为32位整数,还可以检测无效IP地址。注意:为 sockaddr_in
成员赋值时需要显式地将主机字节序转换为网络字节序,而通过 write()/send()
发送数据时TCP
协议会自动转换为网络字节序,不需要再调用相应的函数。
本文摘自:https://www.jianshu.com/p/68735394db7a
本文转自:https://www.workerman.net/q/7729