Blog

互联网入门-KB / KiB,MB / MiB,GB / GiB区别

1KiB = 1,024Byte
1MiB = 1,024KiB
1GiB = 1,024MiB = 1,048,576 KiB
1TiB = 1,024GiB = 1,073,741,824 KiB

1KB = 1,000 Byte
1MB = 1,000 KB
1GB = 1,000,000 KB
1TB = 1,000,000,000 KB

  • 其中,KiB是kilo binary byte的缩写,指的是千位二进制字节
  • 而KB是kilobyte的缩写,指的是千字节
  • 说白了就是二进制与十进制的区别,也就是两种标准问题:国际单位制 SI 制定的十进制标准和 国际电工委员会 制定的二进制标准,也就是通常所说的SI和IEC标准。

众 所周知,在计算机中是采用二进制,在电脑世界里,以2的次方数为“批量”处理Byte会方便一些,整齐一些。每1024Byte为1KB,每1024KB为1MB,每1024MB为1GB,每1024GB为1TB。

而在国际单位制中TB、GB、MB、KB是“1000进制”的数,为此国际电工协会(IEC)拟定了”KiB”、“MiB”、“GiB”的二进制单位,专用来标示“1024进位”的数据大小;而硬盘厂商在计算容量方面是以每1000为一进制的,每1000字节为1KB,每1000KB为1MB,每1000MB为1GB,每1000GB为1TB,在操作系统中对容量的计算是以1024为进位的,并且并未改为”KiB”、“MiB”、“GiB”的二进制单位,这差异造成了硬盘容量“缩水”。买硬碟回家的时候是不是常常发现怎么买回去的容量,与真实可用的容量相差了一点点呢?

这是因为厂商、电脑使用的单位不同的缘故,500G硬碟厂商是使用1KB = 1,000 Byte 计算,但是到了电脑会变成 1KiB = 1,024Byte 计算。因此使用厂商的算法500GB = 500,000 MB,而到了电脑500,000 MB / 1024 MiB = 488.28125 GB。

来自:https://www.twblogs.net/a/5b8d73a02b717718833e15b6/zh-cn

内存与调试-Cheat Engine 介绍与教程通关

Cheat Engine 简称 CE ,这是一款开源的内存查看和修改软件。作用如下:

  • 1、可以查看和修改别的软件的内存数据。
  • 2、可以修改别的软件的运行逻辑和过程。(也就是注入汇编代码)

官网:https://www.cheatengine.org/

CE 是英文版的,里面自带了一个新手通关教程,不过是英文的,可能看不懂。嗯,没关系,网上有人翻译了带中文教程的中文版CE。点击此处下载CE免安装中文版

感觉通关教程,难道不是很大。

1、下面两个是教程1-8 的图文解说,这里就不具体写了。
  • https://www.52pojie.cn/thread-833773-1-1.html
  • https://blog.csdn.net/cgs_______/article/details/77799091

但是有一个巨坑要讲一下:就是关卡8(即step8),多级指针的问题:

最后一个基址指针,需要设置多次偏移,才能使得指针能够指向最终的目标地址。内存与调试-Cheat Engine 介绍与教程通关

等最后,操作完成,点击改变指针就能进入第九关了。如果最后一个基址指针不设置多次偏移(offset)的话,就永远过了第8关了。

2、第九关教程,有点难度,可以看这里:

经过实际测试,这个版本的CE关卡9教程,和下面的攻略有稍许不匹配,但基本思路是一样的。教程来自  https://zhuanlan.zhihu.com/p/33702835 。

游戏讲的是,你需要调整游戏内部数据,来使得玩家控制的Dave和Eric打败500血的电脑。正常情况自动执行,玩家的血量会很快归0,so just hack it!

1 找到四个血量的地址

首先,用精确数值扫描的方法,找到Dave的血量地址,注意这个地方血量是单浮点型。

如上图,我找到了两个玩家的血量地址,并设置了描述。

接着,以Dave为例,右击,选择“是什么改写了这个地址”,打开debug窗口,并再次攻击Dave,找到相应的代码,如图

打开:“显示反汇编程序”

右击moves [rbx+08],xmm0,选择,找出指令访问的地址。出现一个新的空白对话框,再次对每个角色攻击一次,结果如图。

可以发现,前两个地址正是Dave和Eric的地址,并且如果你之前用类似的方法找到了两个电脑的地址,正是下面两个。故猜测,运行“攻击”时,程序是依次获得该角色的指针位置,放到rbx寄存器中,然后在offset为08的位置,就是该角色的血量,修改这个血量,即角色受到了攻击。那么,要让Dave和Eric胜出,我们就要让他们血量不减少的同时,找到电脑的血量,并使其减少。

2 分析数据

选中四个地址,右击选中“打开选中的地址分析数据”(control+D)。如图

可以发现,每个角色,除了在基址的前几个地址有数据,别的都是0,仔细贯彻这些数据可以发现,在offset为14的位置,玩家的值为1,电脑的值为2。并且多次攻击发现,这个值为定值。故,我们可以采用这一点来区分玩家与电脑,达成目标。

回到汇编代码的窗口,分析命令moves [rbx+08],xmm0,并结合上面的代码,我们发现下图这样的代码:

显然,这是一个简单的改变[rbx+08]位置值的指令。先将[rbx+08](血量)存储的值放到xmm1中,再减掉一个xmm0,然后在放回去。

故在subss xmm1,xmm0处代码注入。

3 注入代码

打开-内存浏览器-工具-自动汇编

再打开模板-代码注入

如图

代码会注入在原代码的上方,并且原来的代码也会保留。其中newmem,originalcode等,是汇编中的位置标志,可以直接用来跳转。

故在newmem下添加代码如下:

cmp [rbx+14],1 //判断是否是玩家
jne originalcode //不是玩家,直接跳转到原代码执行
addss xmm1,xmm0 //是玩家,将相减改为相加。也可以去掉这一句,即不对玩家血量进行修改
jmp exit //调到exit处

然后点击执行。回到tutorial程序,重启游戏并自动执行,结果如图

至此,解决了CE的最后一个问题,成功通关。

总的来说,CE是一个相当强劲的修改器,用完之后也深深感到制作者设计之精妙,Cheat Engine :: Index 官方论坛里还有更多的奇技淫巧,有兴趣的朋友可以去看看。


3、CE有什么用,答用于内存分析:

1、可以看到Windows 内存中 字符串编码是utf-16 形式。字符编码-用Cheat Engine查看内存线性地址及系统内部编码

2、可以研究内存分页机制 (下面的文章大体OK,但有部分错误)

https://blog.csdn.net/tutucoo/article/details/84729919

https://www.twblogs.net/a/5b83db5d2b71777cb15c6302/zh-cn

互联网入门-shtml,html,xhtml,dtd,xsd,htm的含义与解析

一、Html与Xhtml 的区别与联系

XHTML1.0是“3种HTML 4文件根据XML 1.0标准重组”而成的,W3C推荐标准。

XHTML 1.0 Strict(严格版)是参照“HTML 4.01 Strict”改编,但不包括被弃用的元素。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

XHTML 1.0 Transitional(过渡版)是参照“HTML 4.01 Transitional”改编,包括已于Strict版本被弃用的呈现性元素(例如<center><font>等)。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

XHTML 1.0 Frameset(框架版)是参照“HTML 4.01 Frameset”改编,并允许于网页中定义框架元素。其文件类型描述为:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">

xhtml1.0与html4.01的区别 https://www.w3.org/TR/2002/REC-xhtml1-20020801/#diffs

XHTML是XML的一种应用。基于这一事实,那些在以SGML为基础的HTML 4中,不完全合法的用法,应被改写。

文档应该是结构良好的

良好结构(Well-formed)[3]是由XML[4]引入的一个新概念。也就是说所有的元素都必须有结束标签或者以特殊的方式书写(如下所述),而且所有的标签必须合理地嵌套。

尽管如此,交叉使用在SGML中仍然是合法的,而且在现有的浏览器中也能够被广泛接受。

正确:元素嵌套

<p><em>这是一个要强调的段落。</em></p>
错误:元素交叉

<em><p>这是一个要强调的段落。</em></p>

元素名称和属性必须小写

XHTML文件要求所有的HTML元素名称和属性名称都要小写。因为XML本身大小写意义不同,因此必须区分开来。比如,<li><LI>是完全不同的。

要有结束标签

基于SGML的HTML 4里面,允许特定的标签省略结束标签;这些元素暗含有结束标记。XHTML不允许省略结束标记。所有元素(包括在DTD中声明为空的标签),都必须有结束标签。在DTD中声明为空的元素可以用结束标签或者使用空元素速记法(参见空元素)。

正确的:结束的元素

<p>這是一個段落。</p><p>這是另一個段落。</p>
錯誤的:没有结束的元素

<p>這是一個段落。<p>這是另一個段落。
等等等。。。直接看原文
HTML 4.01和XHTML 1.0之间的相似性导致许多网站和内容管理系统采用最初的W3C XHTML 1.0建议书。为了帮助作者过渡,W3C提供了有关如何以HTML兼容的方式发布XHTML 1.0文档的指导,并将它们提供给非XHTML设计的浏览器。

这种“HTML兼容”内容使用HTML媒体类型(text/html)而不是XHTML(application/xhtml+xml)的官方Internet媒体类型发送。

二、html与htm的区别

没有区别,但因DOS、Windows 95等早期系统采用的8.3命名规则只支持最长3字符的扩展名,为了兼容采用了htm,而linux或者ios都是支持多位扩展名的。

同理还有 jpg与jpeg 的区别。

三、shtml 与html的区别

本质上都属于静态网页一种,html属于纯静态,客户端浏览器读取html文件是什么就呈现给浏览者什么内容。而shtml则可以使用SSI。

SSI是为WEB服务器提供的一套命令,这些命令只要直接嵌入到HTML文档的注释内容之中即可。如:
<!–#include file=”info.htm”–>
就是一条SSI指令,其作用是将”info.htm”的内容拷贝到当前的页面中,当访问者来浏览时,会看到其它HTML文档一样显示info.htm其中的内容。

假如我们A页面是shtml的静态网页,而A页面里我们使用了include包含嵌入B静态html页面,如果你的服务器空间支持Shtml SSI这个时候我们,浏览器打开A页面时候,就会在A页面显示A原本内容以及B页面内容,我们查看网页源代码,不会发现B页面引入痕迹,而是看到B页面内容完全在A页面里。

假如:
1、A shtml页面里内容是:
我包含页面B:<!–#include file=”b.html”–>

2、B html网页内容:
我是B页面内容

3、这个时候浏览器查看A页面HTML源代码:
A shtml页面里内容是:我是B页面内容

这个就是shtml ssi 包含include魅力之处。

其它的SSI指令使用形式基本同刚才的举例差不多,可见SSI使用只是插入一点代码而已,使用形式非常简单。

当然,如果WEB服务器不支持SSI,它就会只不过将它当作注释信息,直接跳过其中的内容;浏览器也会忽略被包含信息,我们可以查看源代码看到include引入注解信息。

四、dtd的含义

经常能够看到dtd,那到底是什么意思呢?(ps,提前剧透一下,现在dtd已经被xsd取代了)

这首先要从xml,说起:下面举例的是早期2.3版本的web.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app id="WebApp_ID">
	<display-name>q</display-name>
	<welcome-file-list>
		<welcome-file>index.html</welcome-file>
		<welcome-file>index.htm</welcome-file>
		<welcome-file>index.jsp</welcome-file>
		<welcome-file>default.html</welcome-file>
		<welcome-file>default.htm</welcome-file>
		<welcome-file>default.jsp</welcome-file>
	</welcome-file-list>
</web-app>

第一行是 XML 声明。它定义 XML 的版本 (1.0) 和所使用的编码 (UTF-8)。

下面的是DOCTYPE声明。DOCTYPE是document type(文档类型)的简写,它规定了文档类型,文档类型遵循的协议名,以及文档类型协议的具体定义(也就是DTD,Document Type Definition)

在html中,我们也能看DOCTYPE,比如:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

说白了,dtd就是定义了文件中可以使用哪些标签,以及标签的用法。

所有的 XML 文档(以及 HTML 文档)均由以下简单的构建模块构成:

  • 元素
  • 属性
  • 实体
  • PCDATA
  • CDATA

(DTD就是用来定义这些模块的),dtd教程参考http://www.w3school.com.cn/dtd/index.asp

五、xsd的含义

XML Schema 是基于 XML 的 DTD 替代者。
XML Schema 描述 XML 文档的结构。
XML Schema 语言也称作 XML Schema 定义(XML Schema Definition,XSD)。
参考教程http://www.w3school.com.cn/schema/index.asp

举个例子:3.1新版的web.xml 文件

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
  <display-name>o2o</display-name>

</web-app>

第一行,没有变化,第二行不再是DOCTYPE了。

先讲xmlns,这个是xml namespace 的含义,也就是 xml 命名空间。
我重新将web.xml的代码编排一下,便于理解。

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" 
id="WebApp_ID" version="3.1">
  <display-name>o2o</display-name>

</web-app>xmlns="http://xmlns.jcp.org/xml/ns/javaee"

首先xmlns="http://xmlns.jcp.org/xml/ns/javaee" 代表了整个web.xml的默认命名空间。
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"  表示如果标签遇到xsi:xxx的,就以这个http://www.w3.org/2001/XMLSchema-instance命名空间为准。
xsi:schemaLocation 后面跟的是一些列键值对,记录的是 <命名空间,命名空间的定义>

下面是springmvc.xml的配置文件

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xmlns:context="http://www.springframework.org/schema/context"
	xmlns:mvc="http://www.springframework.org/schema/mvc"
	xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd
		http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd">

。。。
</beans>

说明:上述例子中的命名空间xsi调用方法  xsi:schemaLocation或xsi:noNamespaceSchemaLocation 其实就是xsd中对命名空间调用方法进行设置。

这显然是逻辑自恰的,我们在xsd文件中,对命名空间调用一些方法进行设置。那么在xml文件中,自然就可以在命名空间中识别这些设置了。至于xml头中的xsi:schemaLocation,其实也是对命名空间xsi的设置。设置的目的就是将相应的命名空间和xsd文件进行键值对关联。至于xsi的命名空间,因为在本xml文件中,没有用到该命名空间,所以xsi是炮灰,纯粹就是为了让别的命名空间和xsd进行关联。

参考

https://www.w3.org/TR/xmlschema-1/#Instance_Document_Constructions

https://stackoverflow.com/questions/34202967/xmlns-xmlnsxsi-xsischemalocation-and-targetnamespace

 

 

java踩坑-找不到或无法加载主类(Error: Could not find or load main class)

在spring mvc的单元测试中,就是src/test目录下,我写了一个main方法类。这个代码没有任何错误。但是运行时,就报错了。

1、我试着将代码中,添加一行,然后删除一行,保存后,还是报错。

2、我将这个类放到了别的包目录下,单独运行,发现是OK的。

3、我最后将报错的类,改了名字,保存后,发现可以正常运行,没有报错。

4、我将名字又改了回来,这次发现可以正常运行了。

记录一下,奇怪的坑爹。

建站通用-开源富文本编辑器所见即所得wysiwyg-editor

开发博客时,可以集成的 文章编辑器

https://github.com/quilljs/quill

https://github.com/tinymce/

https://github.com/ckeditor/ckeditor5

https://github.com/froala/wysiwyg-editor

其他富文本编辑器:https://segmentfault.com/q/1010000002897384

上面已经回答了,http://simditor.tower.im/,或者kindeditor,ueditor

uEditer 之前用的感觉不是很好。现需要更换,求推荐好用,且兼容性好
比如本站中的富文本编辑器。
主要需求为:能上传图片,排版方便,添加附件。

ckeditor,可以通过js调用他们的API来完成对编辑器的自定义,提供插件也比较丰富。比如可以自定义段落是用p、div或者是br标签来分割?也可以定义内容过滤器指定源码中可以用哪些标签,每个标签允许出现什么属性以及是否允许出现style样式。

官方文档里讲的很详细http://docs.ckeditor.com/ 我最近一直在用,功能很强大,建议下载完整包然后再根据自己的情况定制自己需要的功能。

https://github.com/sofish/pen

SpringMVC-Boot校园商铺-1-搭建maven-web工程并修改动态web版本

一、搭建maven-web工程

1、maven 建项目的时候选择 webapp。然后对话框选择 groupID:就是公司名。artifactID:就是项目名。

2、添加依赖项,比如build path 中 add library –> server runtime

3、在pom.xml中配置jdk编译版本

<build>
<finalName>o2o</finalName>
<plugins>
	<plugin>
		<!-- 指定maven编译的jdk版本,如果不指定,maven3默认用jdk 1.5 maven2默认用jdk1.3 -->
		<groupId>org.apache.maven.plugins</groupId>
		<artifactId>maven-compiler-plugin</artifactId>
		<version>3.6.1</version>
		<configuration>
		   <!-- 一般而言,target与source是保持一致的,但是,有时候为了让程序能在其他版本的jdk中运行(对于低版本目标jdk,源代码中不能使用低版本jdk中不支持的语法),会存在target不同于source的情况 -->                    
			<souce>1.8</souce> <!-- 源代码使用的JDK版本 --> 
			<target>1.8</target><!-- 需要生成的目标class文件的编译版本 -->  
			<encoding>UTF8</encoding><!-- 字符集编码 -->
		</configuration>
	</plugin>
</plugins>
</build>

4、补全工程文件夹和输出位置。maven工程有四个文件夹:

main/resources main/java 编译输出目录:target/classes
test/resources test/java 编译输出目录:target/test-classes
(新创建的test/resources目录,记得要修改一下输出目录)

5、在maven项目中,选中项目右键属性,有个project facets,里面有一个Dynamic web module,将动态网站版本改成3.1。这里eclipse有一个bug,无法修改。需要修改项目文件夹目录,找到.setting隐藏文件夹,编辑文件org.eclipse.wst.common.project.facet.core.xml

<?xml version="1.0" encoding="UTF-8"?>
 <faceted-project> 
<fixed facet="wst.jsdt.web"/> 
<installed facet="java" version="1.7"/> 
<installed facet="jst.web" version="3.1"/> 
<installed facet="wst.jsdt.web" version="1.0"/>
 </faceted-project>

facet=”jst.web” version=”3.1″ 这个2.3值改成3.1后,还需要将web.xml的2.3版本改一下:

<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" >
<web-app> 
<display-name>Archetype Created Web Application</display-name> 
</web-app>

修改成下面这个3.1动态网站版本:

<?xml version="1.0" encoding="UTF-8"?>
 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
 <display-name>Archetype Created Web Application</display-name> 
</web-app>

sbt问题-解决运行慢问题

sbt真是慢出翔啊,没法忍,开代理也是慢的一比,网上各种教程也尼玛不太行,搞了一晚上,记录下来。

Terminal

就按照我说的来别问为什么,我也不知道。

    • ~/.sbt下面创建repositories文件,内容如下:
[repositories]
local
osc: http://maven.aliyun.com/nexus/content/groups/public/
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
  • 打开终端,进入工程目录,有build.sbt那个
  • 执行sbt -Dsbt.override.build.repos=true
  • 执行console

IDEA

  • 在最开始的页面, 就是没打开任何工程的地方,右下角点Configure
  • 点Preference 左上角搜sbt
  • 点开sbt,VM parameter那添加-Dsbt.override.build.repos=true
  • Launcher那选择custom,添加自己的sbt,我的目录是/usr/local/Cellar/sbt/0.13.13/libexec/sbt-launch.jar
  • 如果版本不一致可修改工程里面的build.properties

晚上扫了一眼任正非的《我的父亲母亲》真是感动的不行。

 

来自:https://www.jianshu.com/p/8d3ded620051

 

nginx问题-配置出错-所有https虚拟网站都需要先配置证书

坑爹 ssl 的问题:一开始  nginx 服务器 上面有 两个  443 虚拟主机设置,然后 呢我在一个 地方 配置了 ssl ,在另一个 地方 没有 配置ssl,发现 两个虚拟主机的地址  都无法访问,显示 connection reset  ,然后我 尝试 将所有主机都添加完 ssl ,发现OK了,两边地址都能够访问了。

密码和证书-与证书相关的名称(SSL,X.509,PEM,DER,CRT,CER,KEY,CSR,P12等)

之前没接触过证书加密的话,对证书相关的这些概念真是感觉挺棘手的,因为一下子来了一大堆新名词,看起来像是另一个领域的东西,而不是我们所熟悉的编程领域的那些东西,起码我个人感觉如此,且很长时间都没怎么搞懂.写这篇文章的目的就是为了理理清这些概念,搞清楚它们的含义及关联,还有一些基本操作。

SSL

SSL – Secure Sockets Layer,现在应该叫”TLS”,但由于习惯问题,我们还是叫”SSL”比较多.http协议默认情况下是不加密内容的,这样就很可能在内容传播的时候被别人监听到,对于安全性要求较高的场合,必须要加密,https就是带加密的http协议,而https的加密是基于SSL的,它执行的是一个比较下层的加密,也就是说,在加密前,你的服务器程序在干嘛,加密后也一样在干嘛,不用动,这个加密对用户和开发者来说都是透明的.More:[维基百科]

OpenSSL – 简单地说,OpenSSL是SSL的一个实现,SSL只是一种规范.理论上来说,SSL这种规范是安全的,目前的技术水平很难破解,但SSL的实现就可能有些漏洞,如著名的”心脏出血”.OpenSSL还提供了一大堆强大的工具软件,强大到90%我们都用不到.

证书标准

X.509 – 这是一种证书标准,主要定义了证书中应该包含哪些内容.其详情可以参考RFC5280,SSL使用的就是这种证书标准.

编码格式

同样的X.509证书,可能有不同的编码格式,目前有以下两种编码格式.

PEM – Privacy Enhanced Mail,打开看文本格式,以”—–BEGIN…”开头, “—–END…”结尾,内容是BASE64编码.
查看PEM格式证书的信息:openssl x509 -in certificate.pem -text -noout
Apache和*NIX服务器偏向于使用这种编码格式.

DER – Distinguished Encoding Rules,打开看是二进制格式,不可读.
查看DER格式证书的信息:openssl x509 -in certificate.der -inform der -text -noout
Java和Windows服务器偏向于使用这种编码格式.

相关的文件扩展名

这是比较误导人的地方,虽然我们已经知道有PEM和DER这两种编码格式,但文件扩展名并不一定就叫”PEM”或者”DER”,常见的扩展名除了PEM和DER还有以下这些,它们除了编码格式可能不同之外,内容也有差别,但大多数都能相互转换编码格式.

CRT – CRT应该是certificate的三个字母,其实还是证书的意思,常见于*NIX系统,有可能是PEM编码,也有可能是DER编码,大多数应该是PEM编码,相信你已经知道怎么辨别.

CER – 还是certificate,还是证书,常见于Windows系统,同样的,可能是PEM编码,也可能是DER编码,大多数应该是DER编码.

KEY – 通常用来存放一个公钥或者私钥,并非X.509证书,编码同样的,可能是PEM,也可能是DER.
查看KEY的办法:openssl rsa -in mykey.key -text -noout
如果是DER格式的话,同理应该这样了:openssl rsa -in mykey.key -text -noout -inform der

CSR – Certificate Signing Request,即证书签名请求,这个并不是证书,而是向权威证书颁发机构获得签名证书的申请,其核心内容是一个公钥(当然还附带了一些别的信息),在生成这个申请的时候,同时也会生成一个私钥,私钥要自己保管好.做过iOS APP的朋友都应该知道是怎么向苹果申请开发者证书的吧.
查看的办法:openssl req -noout -text -in my.csr (如果是DER格式的话照旧加上-inform der,这里不写了)

PFX/P12 – predecessor of PKCS#12,对*nix服务器来说,一般CRT和KEY是分开存放在不同文件中的,但Windows的IIS则将它们存在一个PFX文件中,(因此这个文件包含了证书及私钥)这样会不会不安全?应该不会,PFX通常会有一个”提取密码”,你想把里面的东西读取出来的话,它就要求你提供提取密码,PFX使用的时DER编码,如何把PFX转换为PEM编码?
openssl pkcs12 -in for-iis.pfx -out for-iis.pem -nodes
这个时候会提示你输入提取代码. for-iis.pem就是可读的文本.
生成pfx的命令类似这样:openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -out certificate.pfx -certfile CACert.crt

其中CACert.crt是CA(权威证书颁发机构)的根证书,有的话也通过-certfile参数一起带进去.这么看来,PFX其实是个证书密钥库.

JKS – 即Java Key Storage,这是Java的专利,跟OpenSSL关系不大,利用Java的一个叫”keytool”的工具,可以将PFX转为JKS,当然了,keytool也能直接生成JKS,不过在此就不多表了.

证书编码的转换

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

(提示:要转换KEY文件也类似,只不过把x509换成rsa,要转CSR的话,把x509换成req…)

获得证书

向权威证书颁发机构申请证书

用这命令生成一个csr: openssl req -newkey rsa:2048 -new -nodes -keyout my.key -out my.csr
把csr交给权威证书颁发机构,权威证书颁发机构对此进行签名,完成.保留好csr,当权威证书颁发机构颁发的证书过期的时候,你还可以用同样的csr来申请新的证书,key保持不变.

或者生成自签名的证书
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem

在生成证书的过程中会要你填一堆的东西,其实真正要填的只有Common Name,通常填写你服务器的域名,如”yourcompany.com”,或者你服务器的IP地址,其它都可以留空的.
生产环境中还是不要使用自签的证书,否则浏览器会不认,或者如果你是企业应用的话能够强制让用户的浏览器接受你的自签证书也行.向权威机构要证书通常是要钱的,但现在也有免费的,仅仅需要一个简单的域名验证即可.有兴趣的话查查”沃通数字证书”.

 

来自:https://www.cnblogs.com/guogangj/p/4118605.html