Linux入门系列——软件包管理

Linux入门系列——软件包管理,第1张

RedHat 系统中使用的是: rpm (redhat package manager) 现在称:RPM is Package Manager

Debian : dpt

Ubuntu : apt

在安装软件的时候,有可能出现软件包的相互依赖关系;所以红帽公司推出了:yum(Yellowdog update modifier)

包的组成部分:

主包:

bind-971-1e15i586rpm

子包:

bind-libs-971-1e15i586rpm

bind-utils-971-1e15i586rpm

包名:

PackageName-Version-ReleaseArchrpm

bind-major-minor-releases-releasearchrpm

包名-主版本号-次版本号-发行号-rpm包的制作者的发行号硬件平台rpm

主版本号:重大改进;

次版本号:某个子功能发生重大变化;

发行号:修改BUG,调整了一点功能;

bind-971-1noarchrpm 这里的noarch表示不区分硬件平台,32和64都可以使用;如果是ppc则是在PowerPc上使用的包;

# rpm -ivh /path/to/Package_Name

-i,--install 表示安装

-v 表示显示安装过程的信息

-h 表示以#显示安装的进程,总数为50个;

-vv 显示更详细的过程;

--nodeps 安装的时候忽略依赖关系;

--force 无论之前是否安装过,都强制安装,可以实现重装、降级;

--replacepkgs 重新安装,替换原有的安装;

--oldpackage 对软件包进行降级;

--test Do not install the package, simply check for and report potential conflicts 不进行安装,只测试看在安装的时候有没有依赖包要装;

rpm -q soft_name

# rpm -q >

很简单,本部署指南的适用范围:IIS7/8版本。

CA给你邮箱发一份文件,解压获取一个youdomainpfx格式的证书文件。

1、创建SSL证书控制台

使用windows键+R打开运行窗口输入“mmc”点确定。

打开控制台,点击“文件”=>“添加/删除管理单元”。

找到“证书”点击“添加”。

选择“计算机账户”,点击“下一步”。

最后点完成。

导入PFX证书

在添加的证书管理单元中,选择“证书”- “个人”-“证书”,右键空白处点“所有任务”选择“导入”

进入证书导入向导,点击下一步

导入上面合成的>

选择“根据证书内容自动选择存储区”,点击“下一步”

证书导入成功,右键刷新可以看到。

部署服务器证书

打开IIS控制面板,选中需要配置证书的站点,并选择右侧“编辑站点”下的“绑定”。

选择“添加” 并按以下方式设置。

类型:>

访问测试

服务器若部署了SSL证书,浏览器访问时将出现安全锁标志;

如果不清楚,可以参考:网页链接

第一个坑: 有效期

windows在判断证书是否有效时不检测证书的有效期, 即使该证书超过有效期好几年了, 只要没有被吊销, 微软仍然认为它是有效的 但在 openssl 提供的 X509_verify_cert 函数会验证证书的有效期, 因此需要注释掉验证有效期的那部分代码并重新编译 openssl

OK, 从 openssl 官网 上下载最新的版本, 好吧, 现在还是刚刚修复 Heartbleed 漏洞的 101g 版本

下载, 解压, 看下 INSTALL 文档, 先试试可以编译不:

/config

make

运气不错, 不用安装什么依赖直接编译成功 将代码根目录产生的 libcryptoa 添加到项目中测试下, OK, 可以使用, 下面开始折腾了~

在 crypto/x509/x509_vfyc 的 153 行找到 X509_verify_cert 函数(在线查看), 局部变量 ok 缓存每一步验证是否通过, 它依次调用了:

check_issued

check_chain_extensions

check_name_constraints

check_trust

check_revocation

internal_verify

check_policy

其中 internal_verify (在线查看)验证了证书的有效期, 进入这个函数, 在 1654 行找到这个代码:

ok = check_cert_time(ctx, xs);

if (!ok)

goto end;

看看 check_cert_time 函数, 确认是检查 notBefore 和 notAfter, 因此将上面三行代码注释掉, 验证证书时就不会检测有效期了

然后就是重新编译 openssl, 将 libcryptoa 集成到项目里了~

第二个坑: unhandled critical extension

搜索了下, 在 openssl 官网上找到这个:

-ignore_critical

Normally if an unhandled critical extension is present which is not supported by OpenSSL the certificate is rejected (as required by RFC5280) If this option is set critical extensions are ignored

原来是当openssl遇到证书中有它不支持的 未处理的关键扩展(unhandled critical extension ) 时, 它会拒绝加载该证书

再搜索下 -ignore_critical, 在 verifyc 中找到如下代码片段:

else if (strcmp(argv,"-ignore_critical") == 0)

vflags |= X509_V_FLAG_IGNORE_CRITICAL;

然后再使用 X509_STORE_set_flags 函数设置标志位:

X509_STORE ctx;

X509_STORE_set_flags(ctx, vflags);

即可

第三个坑: certificate signature failure

这个坑填不上了, openssl 说:

7 X509_V_ERR_CERT_SIGNATURE_FAILURE: certificate signature failure

the signature of the certificate is invalid

在windows下导出证书文件, 直接用 openssl 验证, 在加载证书就会出错, PEM_read_bio_X509 返回为空

第四个坑: A certificate was explicitly revoked by its issuer

A certificate was explicitly revoked by its issuer 是 Sysinternals 提供的工具sigcheckexe 的检测结果, 把文件拎出来一看, 证书真的被撤销了

OK, 只好根据证书上的 CRL Distribution Point(CRL 分发点) 提供的 URL 下载 撤销证书列表 文件, 然后在调用 X509_verify_cert 验证证书链之前, 设置填充被撤销的证书列表:

X509_CRL d2i_X509_CRL_fp(FILE fp, X509_CRL crl); // 读取被撤销的证书列表

STACK_OF(X509_CRL) sk_X509_CRL_new_null();

#define sk_X509_CRL_push(st, val) SKM_sk_push(X509_CRL, (st), (val)); // sk_X509_CRL_push(STACK_OF(X509_CRL) crls, X509_CRL crl);

void X509_STORE_CTX_set0_crls(X509_STORE_CTX c, STACK_OF(X509_CRL) sk); // 设置被撤销的证书列表

同时, 也要设置检查被撤销证书列表的标志位 X509_V_FLAG_CRL_CHECK, 然后再调用X509_verify_cert 验证证书链即可

填了第四个坑后又引起了第五个坑(如何获取撤销证书列表)和第六个坑(设置检测撤销证书列表的标识位后, 如果该证书没有撤销证书列表则直接报错)

第五个坑: 获取撤销证书列表文件

证书上的 CRL Distribution Point(CRL 分发点) 属于扩展属性, 在 PKCS #7: Cryptographic Message Syntax V15 上没有相关介绍

在 StackOverflow 上找到这个问答 Openssl - How to check if a certificate is revoked or not, 其中第二个回答说 CRL 是在 RFC 5280 中定义的, 除了证书中附带被撤销的证书列表以外还有使用 OCSP 协议的, 即使证书撤销列表也分为使用 URL分发点和 LDAP DNs()提供的, 目前先考虑使用 URL 作为 CRL分发点 的情况吧

然而 openssl 没有提供直接获取 CRL 分发点 URL 的API, 那个回答说 Apache 的 mod_ssl 模块有本地 CRL 和 OCSP 检测的实现代码, 但没有说明哪里有检测使用 URL 作为 CRL分发点 的实现方法

然后又在 frank4ddcom上找到这个代码 certextensionsc, 他给出了一个如何使用 openssl 从 X509v3 版本的证书文件中提取扩展内容的示例程序, 太感谢 Frank4DD 这位仁兄了~~~

到这里后, 可以直接使用他的示例程序, 根据关键字 Full Name 和 URI 定位 CRL 分发点 的 URL, 也可以看看 openssl 是如何提取这个 URL 的, 然后自己实现一个接口

如果自作孽使用第二种方法的话, 就编译个 debug 版的 openssl 库, 然后调试跟进X509V3_EXT_print 函数, 一步一步的向下走, 直到走到 GENERAL_NAME_print 函数, 这里就是终点了然后就知道了 CRL 分发点 的 URL 的编号为 6, 也就是 GEN_URI, 直接取结果吧

第六个坑: CRL有效期

在windows环境下每次查看PE文件的数字签名时, windows 都会从 CRL分发点 下载吊销证书列表做验证, 一般来说, 每个 CRL的有效期是非常短的, 大概只有 5~20 天的有效期吧, 然而我们不可能像 windows 一样每次查看数字签名时就从 CRL分发点 下载最新的吊销列表.

另外, windows 遇到过期的 CRL 时不会产生证书链无效的结果, 但 openssl 在遇到过期的 CRL 时就会导致证书链验证失败, 因此在加载和验证 CRL 时, 要忽略 CRL 的有效期

分析 openssl 源代码, X509_verify_cert 调用 check_revocation , 之后调用 check_cert , 然后再调用 check_crl , 在这个函数里有检测 CRL 有效期的代码:

if (!(ctx->current_crl_score & CRL_SCORE_TIME))

{

ok = check_crl_time(ctx, crl, 1);

if (!ok)

goto err;

}

将其注释掉即可忽略检测 CRL 有效期

第七个坑: CRL 列表为空导致 openssl 认为没有加载 CRL

9 初始化顺序

10 证书名: key_id

GNU Privacy Guard(GnuPG或GPG)是一种加密软件,它是PGP加密软件的满足GPL的替代物。GnuPG依照由IETF订定的OpenPGP技术标准设计。GnuPG用于加密、数字签名及产生非对称钥匙对的软件。

首先安装GPG

sudo apt install gnupg

gpg --gen-key

Real name: 输入用户名

Email address: 输入邮箱

Change (N)ame, (E)mail, or (O)kay/(Q)uit O

最后查看

gpg --list-keys

设备与处理器之间的工作通常来说是异步,设备数据要传递给处理器通常来说有以下几种方法:轮询、等待和中断。

让CPU进行轮询等待总是不能让人满意,所以通常都采用中断的形式,让设备来通知CPU读取数据。

26内核的函数参数与现在的参数有所区别,这里都主要介绍概念,具体实现方法需要结合具体的内核版本。

request_irq函数申请中断,返回0表示申请成功,其他返回值表示申请失败,其具体参数解释如下:

flags 掩码可以使用以下几个:

快速和慢速处理例程 :现代内核中基本没有这两个概念了,使用SA_INTERRUPT位后,当中断被执行时,当前处理器的其他中断都将被禁止。通常不要使用SA_INTERRUPT标志位,除非自己明确知道会发生什么。

共享中断 :使用共享中断时,一方面要使用SA_SHIRQ位,另一个是request_irq中的dev_id必须是唯一的,不能为NULL。这个限制的原因是:内核为每个中断维护了一个共享处理例程的列表,例程中的dev_id各不相同,就像设备签名。如果dev_id相同,在卸载的时候引起混淆(卸载了另一个中断),当中断到达时会产生内核OOP消息。

共享中断需要满足以下一个条件才能申请成功:

当不需要使用该中断时,需要使用free_irq释放中断。

通常我们会在模块加载的时候申请安装中断处理例程,但书中建议:在设备第一次打开的时候安装,在设备最后一次关闭的时候卸载。

如果要查看中断触发的次数,可以查看 /proc/interrupts 和 /proc/stat。

书中讲述了如何自动检测中断号,在嵌入式开发中通常都是查看原理图和datasheet来直接确定。

自动检测的原理如下:驱动程序通知设备产生中断,然后查看哪些中断信号线被触发了。Linux提供了以下方法来进行探测:

探测工作耗时较长,建议在模块加载的时候做。

中断处理函数和普通函数其实差不多,唯一的区别是其运行的中断上下文中,在这个上下文中有以下注意事项:

中断处理函数典型用法如下:

中断处理函数的参数和返回值含义如下:

返回值主要有两个:IRQ_NONE和IRQ_HANDLED。

对于中断我们是可以进行开启和关闭的,Linux中提供了以下函数 *** 作单个中断的开关:

该方法可以在所有处理器上禁止或启用中断。

需要注意的是:

如果要关闭当前处理器上所有的中断,则可以调用以下方法:

local_irq_save 会将中断状态保持到flags中,然后禁用处理器上的中断;如果明确知道中断没有在其他地方被禁用,则可以使用local_irq_disable,否则请使用local_irq_save。

locat_irq_restore 会根据上面获取到flags来恢复中断;local_irq_enable 会无条件打开所有中断。

在中断中需要做一些工作,如果工作内容太多,必然导致中断处理所需的时间过长;而中断处理又要求能够尽快完成,这样才不会影响正常的系统调度,这两个之间就产生了矛盾。

现在很多 *** 作系统将中断分为两个部分来处理上面的矛盾:顶半部和底半部。

顶半部就是我们用request_irq来注册的中断处理函数,这个函数要求能够尽快结束,同时在其中调度底半部,让底半部在之后来进行后续的耗时工作。

顶半部就不再说明了,就是上面的中断处理函数,只是要求能够尽快处理完成并返回,不要处理耗时工作。

底半部通常使用tasklet或者工作队列来实现。

tasklet的特点和注意事项:

工作队列的特点和注意事项:

以上就是关于Linux入门系列——软件包管理全部的内容,包括:Linux入门系列——软件包管理、自己在Linux系统下自签生成的数字证书是否可用、Linux的ssl证书安装步骤等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10089030.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存