【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

Linux98

我们前面一直谈到的大多是一般身份使用者与系统管理员 (root) 的相关操作, 而且大多是讨论关于可登陆系统的帐号来说。那么换个角度想,如果我今天想要创建的, 是一个"仅能使用 mail server 相关邮件服务的帐号,而该帐号并不能登陆 Linux 主机"呢?如果不能给予该帐号一个密码,那么该帐号就无法使用系统的各项资源,当然也包括 mail 的资源, 而如果给予一个密码,那么该帐号就可能可以登陆 Linux 主机啊!呵呵~伤脑筋吧~ 所以,下面让我们来谈一谈这些有趣的话题啰!

另外,在本章之前谈到过 /etc/login.defs 文件中,关于密码长度应该默认是 5 个字串长度,但是我们上面也谈到,该设置值已经被 PAM 模块所取代了,那么 PAM 是什么?为什么他可以影响我们使用者的登陆呢?这里也要来谈谈的!

13.5.1 特殊的 shell, /sbin/nologin

在本章一开头的 passwd 文件结构里面我们就谈过系统帐号这玩意儿,这玩意儿的 shell 就是使用 /sbin/nologin ,重点在于系统帐号是不需要登陆的!所以我们就给他这个无法登陆的合法 shell。 使用了这个 shell 的用户即使有了密码,你想要登陆时他也无法登陆,因为会出现如下的讯息喔:

This account is currently not available.
我们所谓的"无法登陆"指的仅是:"这个使用者无法使用 bash 或其他 shell 来登陆系统"而已, 并不是说这个帐号就无法使用其他的系统资源喔! 举例来说,各个系统帐号,打印工作由 lp 这个帐号在管理, WWW 服务由 apache 这个帐号在管理, 他们都可以进行系统程序的工作,但是"就是无法登陆主机取得互动的 shell"而已啦!_

换个角度来想,如果我的 Linux 主机提供的是邮件服务,所以说,在这部 Linux 主机上面的帐号, 其实大部分都是用来收受主机的信件而已,并不需要登陆主机的呢! 这个时候,我们就可以考虑让单纯使用 mail 的帐号以 /sbin/nologin 做为他们的 shell , 这样,最起码当我的主机被尝试想要登陆系统以取得 shell 环境时,可以拒绝该帐号呢!

另外,如果我想要让某个具有 /sbin/nologin 的使用者知道,他们不能登陆主机时, 其实我可以创建" /etc/nologin.txt "这个文件, 并且在这个文件内说明不能登陆的原因,那么下次当这个使用者想要登陆系统时, 屏幕上出现的就会是 /etc/nologin.txt 这个文件的内容,而不是默认的内容了!

例题:当使用者尝试利用纯 mail 帐号 (例如 myuser3) 时,利用 /etc/nologin.txt 告知使用者不要利用该帐号登陆系统。答:直接以 vim 编辑该文件,内容可以是这样:

[root@study ~]# vim /etc/nologin.txt
This account is system account or mail account.

Please DO NOT use this account to login my Linux server.

想要测试时,可以使用 myuser3 (此帐号的 shell 是 /sbin/nologin) 来测试看看!

[root@study ~]# su - myuser3
This account is system account or mail account.

Please DO NOT use this account to login my Linux server.

结果会发现与原本的默认讯息不一样喔! _

在过去,我们想要对一个使用者进行认证 (authentication),得要要求使用者输入帐号密码, 然后通过自行撰写的程序来判断该帐号密码是否正确。也因为如此,我们常常得使用不同的机制来判断帐号密码, 所以搞的一部主机上面拥有多个各别的认证系统,也造成帐号密码可能不同步的验证问题! 为了解决这个问题因此有了 PAM (Pluggable Authentication Modules, 嵌入式模块) 的机制!

PAM 可以说是一套应用程序接口 (Application Programming Interface, API),他提供了一连串的验证机制,只要使用者将验证阶段的需求告知 PAM 后, PAM 就能够回报使用者验证的结果 (成功或失败)。由于 PAM 仅是一套验证的机制,又可以提供给其他程序所调用引用,因此不论你使用什么程序,都可以使用 PAM 来进行验证,如此一来,就能够让帐号密码或者是其他方式的验证具有一致的结果!也让程序设计师方便处理验证的问题喔! [5]

PAM 模块与其他程序的相关性图13.5.1、PAM 模块与其他程序的相关性

如上述的图示, PAM 是一个独立的 API 存在,只要任何程序有需求时,可以向 PAM 发出验证要求的通知, PAM 经过一连串的验证后,将验证的结果回报给该程序,然后该程序就能够利用验证的结果来进行可登陆或显示其他无法使用的讯息。 这也就是说,你可以在写程序的时候将 PAM 模块的功能加入,就能够利用 PAM 的验证功能啰。 因此目前很多程序都会利用 PAM 喔!所以我们才要来学习他啊!

PAM 用来进行验证的数据称为模块 (Modules),每个 PAM 模块的功能都不太相同。举例来说, 还记得我们在本章使用 passwd 指令时,如果随便输入字典上面找的到的字串, passwd 就会回报错误信息了!这是为什么呢?这就是 PAM 的 pam_cracklib.so 模块的功能!他能够判断该密码是否在字典里面! 并回报给密码修改程序,此时就能够了解你的密码强度了。

所以,当你有任何需要判断是否在字典当中的密码字串时,就可以使用 pam_cracklib.so 这个模块来验证! 并根据验证的回报结果来撰写你的程序呢!这样说,可以理解 PAM 的功能了吧?

PAM 借由一个与程序相同文件名的配置文件来进行一连串的认证分析需求。我们同样以 passwd 这个指令的调用 PAM 来说明好了。 当你执行 passwd 后,这支程序调用 PAM 的流程是:

  • 使用者开始执行 /usr/bin/passwd 这支程序,并输入密码;
  • passwd 调用 PAM 模块进行验证;
  • PAM 模块会到 /etc/pam.d/ 找寻与程序 (passwd) 同名的配置文件;
  • 依据 /etc/pam.d/passwd 内的设置,引用相关的 PAM 模块逐步进行验证分析;
  • 将验证结果 (成功、失败以及其他讯息) 回传给 passwd 这支程序;
  • passwd 这支程序会根据 PAM 回传的结果决定下一个动作 (重新输入新密码或者通过验证!)

从上头的说明,我们会知道重点其实是 /etc/pam.d/ 里面的配置文件,以及配置文件所调用的 PAM 模块进行的验证工作! 既然一直谈到 passwd 这个密码修改指令,那我们就来看看 /etc/pam.d/passwd 这个配置文件的内容是怎样吧!

[root@study ~]# cat /etc/pam.d/passwd
#%PAM-1.0  <==PAM&#x7248;&#x672C;&#x7684;&#x8BF4;&#x660E;&#x800C;&#x5DF2;&#xFF01;
auth       include      system-auth   <==&#x6BCF;&#x4E00;&#x884C;&#x90FD;&#x662F;&#x4E00;&#x4E2A;&#x9A8C;&#x8BC1;&#x7684;&#x8FC7;&#x7A0B;
account    include      system-auth
password   substack     system-auth
-password   optional    pam_gnome_keyring.so use_authtok
password   substack     postlogin
&#x9A8C;&#x8BC1;&#x7C7B;&#x522B;   &#x63A7;&#x5236;&#x6807;&#x51C6;     PAM &#x6A21;&#x5757;&#x4E0E;&#x8BE5;&#x6A21;&#x5757;&#x7684;&#x53C2;&#x6570;

在这个配置文件当中,除了第一行宣告 PAM 版本之外,其他任何" # "开头的都是注解,而每一行都是一个独立的验证流程, 每一行可以区分为三个字段,分别是验证类别(type)、控制标准(flag)、PAM的模块与该模块的参数。 下面我们先来谈谈验证类别与控制标准这两项数据吧!

Tips 你会发现在我们上面的表格当中出现的是" include (包括) "这个关键字,他代表的是"请调用后面的文件来作为这个类别的验证", 所以,上述的每一行都要重复调用 /etc/pam.d/system-auth 那个文件来进行验证的意思!

验证类别主要分为四种,分别说明如下:

这四个验证的类型通常是有顺序的,不过也有例外就是了。 会有顺序的原因是,(1)我们总是得要先验证身份 (auth) 后, (2)系统才能够借由使用者的身份给予适当的授权与权限设置 (account),而且(3)登陆与登出期间的环境才需要设置, 也才需要记录登陆与登出的信息 (session)。如果在运行期间需要密码修订时,(4)才给予 password 的类别。这样说起来, 自然是需要有点顺序吧!

那么"验证的控制旗标(control flag)"又是什么?简单的说,他就是"验证通过的标准"啦! 这个字段在管控该验证的放行方式,主要也分为四种控制方式:

如果将这些控制旗标以图示的方式配合成功与否的条件绘图,会有点像下面这样:

PAM 控制旗标所造成的回报流程图13.5.2、PAM 控制旗标所造成的回报流程

程序运行过程中遇到验证时才会去调用 PAM ,而 PAM 验证又分很多类型与控制,不同的控制旗标所回报的讯息并不相同。 如上图所示, requisite 失败就回报了并不会继续,而 sufficient 则是成功就回报了也不会继续。 至于验证结束后所回报的信息通常是"succes 或 failure "而已,后续的流程还需要该程序的判断来继续执行才行。

谈完了配置文件的语法后,现在让我们来查阅一下 CentOS 5.x 提供的 PAM 默认文件的内容是啥吧! 由于我们常常需要通过各种方式登陆 (login) 系统,因此就来看看登陆所需要的 PAM 流程为何:

[root@study ~]# cat /etc/pam.d/login
#%PAM-1.0
auth [user_unknown=ignore success=ok ignore=ignore default=bad] pam_securetty.so
auth       substack     system-auth
auth       include      postlogin
account    required     pam_nologin.so
account    include      system-auth
password   include      system-auth
pam_selinux.so close should be the first session rule
session    required     pam_selinux.so close
session    required     pam_loginuid.so
session    optional     pam_console.so
pam_selinux.so open should only be followed by sessions to be executed in the user context
session    required     pam_selinux.so open
session    required     pam_namespace.so
session    optional     pam_keyinit.so force revoke
session    include      system-auth
session    include      postlogin
-session   optional     pam_ck_connector.so
&#x6211;&#x4EEC;&#x53EF;&#x4EE5;&#x770B;&#x5230;&#xFF0C;&#x5176;&#x5B9E; login &#x4E5F;&#x8C03;&#x7528;&#x591A;&#x6B21;&#x7684; system-auth &#xFF0C;&#x6240;&#x4EE5;&#x4E0B;&#x9762;&#x5217;&#x51FA;&#x8BE5;&#x914D;&#x7F6E;&#x6587;&#x4EF6;

[root@study ~]# cat /etc/pam.d/system-auth
#%PAM-1.0
This file is auto-generated.

User changes will be destroyed the next time authconfig is run.

auth        required      pam_env.so
auth        sufficient    pam_fprintd.so
auth        sufficient    pam_unix.so nullok try_first_pass
auth        requisite     pam_succeed_if.so uid >= 1000 quiet_success
auth        required      pam_deny.so

account     required      pam_unix.so
account     sufficient    pam_localuser.so
account     sufficient    pam_succeed_if.so uid < 1000 quiet
account     required      pam_permit.so

password    requisite     pam_pwquality.so try_first_pass local_users_only retry=3 authtok_type=
password    sufficient    pam_unix.so sha512 shadow nullok try_first_pass use_authtok
password    required      pam_deny.so

session     optional      pam_keyinit.so revoke
session     required      pam_limits.so
-session     optional      pam_systemd.so
session     [success=1 default=ignore] pam_succeed_if.so service in crond quiet use_uid
session     required      pam_unix.so

上面这个表格当中使用到非常多的 PAM 模块,每个模块的功能都不太相同,详细的模块情报可以在你的系统中找到:

/etc/pam.d/*&#xFF1A;&#x6BCF;&#x4E2A;&#x7A0B;&#x5E8F;&#x4E2A;&#x522B;&#x7684; PAM &#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1B;
/lib64/security/*&#xFF1A;PAM &#x6A21;&#x5757;&#x6587;&#x4EF6;&#x7684;&#x5B9E;&#x9645;&#x653E;&#x7F6E;&#x76EE;&#x5F55;&#xFF1B;
/etc/security/*&#xFF1A;&#x5176;&#x4ED6; PAM &#x73AF;&#x5883;&#x7684;&#x914D;&#x7F6E;&#x6587;&#x4EF6;&#xFF1B;
/usr/share/doc/pam-*/&#xFF1A;&#x8BE6;&#x7EC6;&#x7684; PAM &#x8BF4;&#x660E;&#x6587;&#x6863;&#x3002;

例如鸟哥使用未 update 过的 CentOS 7.1 ,pamnologin 说明文档在: /usr/share/doc/pam-1.1.8/txts/README.pam_nologin。你可以自行查阅一下该模块的功能。 鸟哥这里仅简单介绍几个较常使用的模块,详细的信息还得要您努力查阅参考书呢! ^^

总之,就是依据验证类别 (type) 来看,然后先由 login 的设置值去查阅,如果出现" include system-auth " 就转到 system-auth 文件中的相同类别,去取得额外的验证流程就是了。然后再到下一个验证类别,最终将所有的验证跑完! 就结束这次的 PAM 验证啦!

经过这样的验证流程,现在你知道为啥 /etc/nologin 存在会有问题,也会知道为何你使用一些远端连线机制时, 老是无法使用 root 登陆的问题了吧?没错!这都是 PAM 模块提供的功能啦!

例题:为什么 root 无法以 telnet 直接登陆系统,但是却能够使用 ssh 直接登陆?答:一般来说, telnet 会引用 login 的 PAM 模块,而 login 的验证阶段会有 /etc/securetty 的限制! 由于远端连线属于 pts/n (n 为数字) 的动态终端机接口设备名称,并没有写入到 /etc/securetty , 因此 root 无法以 telnet 登陆远端主机。至于 ssh 使用的是 /etc/pam.d/sshd 这个模块, 你可以查阅一下该模块,由于该模块的验证阶段并没有加入 pam_securetty ,因此就没有 /etc/securetty 的限制!故可以从远端直接连线到服务器端。

另外,关于 telnet 与 ssh 的细部说明,请参考鸟哥的 Linux 私房菜服务器篇

除了前一小节谈到的 /etc/securetty会影响到 root 可登陆的安全终端机, /etc/nologin 会影响到一般使用者是否能够登陆的功能之外,我们也知道 PAM 相关的配置文件在 /etc/pam.d , 说明文档在 /usr/share/doc/pam-(版本) ,模块实际在 /lib64/security/ 。那么还有没有相关的 PAM 文件呢? 是有的,主要都在 /etc/security 这个目录内!我们下面介绍几个可能会用到的配置文件喔!

我们在第十章谈到的 ulimit 功能中, 除了修改使用者的 ~/.bashrc 配置文件之外,其实系统管理员可以统一借由 PAM 来管理的! 那就是 /etc/security/limits.conf 这个文件的设置了。这个文件的设置很简单,你可以自行参考一下该文件内容。 我们这里仅作个简单的介绍:

&#x8303;&#x4F8B;&#x4E00;&#xFF1A;vbird1 &#x8FD9;&#x4E2A;&#x7528;&#x6237;&#x53EA;&#x80FD;&#x521B;&#x5EFA; 100MB &#x7684;&#x6587;&#x4EF6;&#xFF0C;&#x4E14;&#x5927;&#x4E8E; 90MB &#x4F1A;&#x8B66;&#x544A;
[root@study ~]# vim /etc/security/limits.conf
vbird1    soft        fsize         90000
vbird1    hard        fsize        100000
#&#x5E10;&#x53F7;   &#x9650;&#x5236;&#x4F9D;&#x636E;    &#x9650;&#x5236;&#x9879;&#x76EE;     &#x9650;&#x5236;&#x503C;
&#x7B2C;&#x4E00;&#x5B57;&#x6BB5;&#x4E3A;&#x5E10;&#x53F7;&#xFF0C;&#x6216;&#x8005;&#x662F;&#x7FA4;&#x7EC4;&#xFF01;&#x82E5;&#x4E3A;&#x7FA4;&#x7EC4;&#x5219;&#x524D;&#x9762;&#x9700;&#x8981;&#x52A0;&#x4E0A; @ &#xFF0C;&#x4F8B;&#x5982; @projecta
&#x7B2C;&#x4E8C;&#x5B57;&#x6BB5;&#x4E3A;&#x9650;&#x5236;&#x7684;&#x4F9D;&#x636E;&#xFF0C;&#x662F;&#x4E25;&#x683C;&#xFF08;hard&#xFF09;&#xFF0C;&#x8FD8;&#x662F;&#x4EC5;&#x4E3A;&#x8B66;&#x544A;&#xFF08;soft&#xFF09;&#xFF1B;
&#x7B2C;&#x4E09;&#x5B57;&#x6BB5;&#x4E3A;&#x76F8;&#x5173;&#x9650;&#x5236;&#xFF0C;&#x6B64;&#x4F8B;&#x4E2D;&#x9650;&#x5236;&#x6587;&#x4EF6;&#x5927;&#x5C0F;&#xFF0C;
&#x7B2C;&#x56DB;&#x5B57;&#x6BB5;&#x4E3A;&#x9650;&#x5236;&#x7684;&#x503C;&#xFF0C;&#x5728;&#x6B64;&#x4F8B;&#x4E2D;&#x5355;&#x4F4D;&#x4E3A; KB&#x3002;
&#x82E5;&#x4EE5; vbird1 &#x767B;&#x9646;&#x540E;&#xFF0C;&#x8FDB;&#x884C;&#x5982;&#x4E0B;&#x7684;&#x64CD;&#x4F5C;&#x5219;&#x4F1A;&#x6709;&#x76F8;&#x5173;&#x7684;&#x9650;&#x5236;&#x51FA;&#x73B0;&#xFF01;
[vbird1@study ~]$ ulimit -a
....&#xFF08;&#x524D;&#x9762;&#x7701;&#x7565;&#xFF09;....

file size               &#xFF08;blocks, -f&#xFF09; 90000
....&#xFF08;&#x540E;&#x9762;&#x7701;&#x7565;&#xFF09;....

[vbird1@study ~]$ dd if=/dev/zero of=test bs=1M count=110
File size limit exceeded
[vbird1@study ~]$ ll --block-size=K test
-rw-rw-r--. 1 vbird1 vbird1 90000K Jul 22 01:33 test
&#x679C;&#x7136;&#x6709;&#x9650;&#x5236;&#x5230;&#x4E86;
&#x8303;&#x4F8B;&#x4E8C;&#xFF1A;&#x9650;&#x5236; pro1 &#x8FD9;&#x4E2A;&#x7FA4;&#x7EC4;&#xFF0C;&#x6BCF;&#x6B21;&#x4EC5;&#x80FD;&#x6709;&#x4E00;&#x4E2A;&#x4F7F;&#x7528;&#x8005;&#x767B;&#x9646;&#x7CFB;&#x7EDF; &#xFF08;maxlogins&#xFF09;
[root@study ~]# vim /etc/security/limits.conf
@pro1   hard   maxlogins   1
&#x5982;&#x679C;&#x8981;&#x4F7F;&#x7528;&#x7FA4;&#x7EC4;&#x529F;&#x80FD;&#x7684;&#x8BDD;&#xFF0C;&#x8FD9;&#x4E2A;&#x529F;&#x80FD;&#x4F3C;&#x4E4E;&#x5BF9;&#x521D;&#x59CB;&#x7FA4;&#x7EC4;&#x624D;&#x6709;&#x6548;&#x5594;&#xFF01;&#x800C;&#x5982;&#x679C;&#x4F60;&#x5C1D;&#x8BD5;&#x591A;&#x4E2A; pro1 &#x7684;&#x767B;&#x9646;&#x65F6;&#xFF0C;
&#x7B2C;&#x4E8C;&#x4E2A;&#x4EE5;&#x540E;&#x5C31;&#x65E0;&#x6CD5;&#x767B;&#x9646;&#x4E86;&#x3002;&#x800C;&#x4E14;&#x5728; /var/log/secure &#x6587;&#x4EF6;&#x4E2D;&#x8FD8;&#x4F1A;&#x51FA;&#x73B0;&#x5982;&#x4E0B;&#x7684;&#x4FE1;&#x606F;&#xFF1A;
pam_limits&#xFF08;login:session&#xFF09;: Too many logins &#xFF08;max 1&#xFF09; for pro1

这个文件挺有趣的,而且是设置完成就生效了,你不用重新启动任何服务的! 但是 PAM 有个特殊的地方,由于他是在程序调用时才予以设置的,因此你修改完成的数据, 对于已登陆系统中的使用者是没有效果的,要等他再次登陆时才会生效喔!另外, 上述的设置请在测试完成后立刻注解掉,否则下次这两个使用者登陆就会发生些许问题啦! _

/var/log/secure, /var/log/messages
如果发生任何无法登陆或者是产生一些你无法预期的错误时,由于 PAM 模块都会将数据记载在 /var/log/secure 当中,所以发生了问题请务必到该文件内去查询一下问题点!举例来说, 我们在 limits.conf 的介绍内的范例二,就有谈到多重登陆的错误可以到 /var/log/secure 内查阅了! 这样你也就知道为何第二个 pro1 无法登陆啦!_

Original: https://www.cnblogs.com/nightnine/p/14697303.html
Author: dozeoo
Title: 【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块



相关阅读1

Title: 国产化之银河麒麟.netcore3.1访问https服务的两个问题

背景

某个项目需要实现基础软件全部国产化,其中操作系统指定银河麒麟,数据库使用达梦V8,CPU平台的范围包括x64、龙芯、飞腾、鲲鹏等。

考虑到这些基础产品对.NETCore的支持,最终选择了3.1版本。主要原因就是龙芯搞了自研CPU架构,用户量不够大,.NET官方并没有专门针对龙芯的支持,而龙芯团队只对.netcore3.1做了适配(目前.net6适配测试中),至于其它的国产CPU则是基于Arm64和x64的,.NET官方都有支持。

环境

  • 主机操作系统:Windows 10
  • 虚拟化工具:QEMU
  • 虚拟机CPU:cortex-a53(ARMv8架构,支持Arm64)
  • 虚拟机操作系统:银河麒麟 v4 (未安装桌面)

问题

问题一:无法验证xxx的由yyy颁发的证书

这个错误是在开发环境出现的,通过wget请求https服务时抛出异常:

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

具体错误提示如图所示,使用HttpClient发起请求一样会报错,这是因为安装的操作系统没有自带根CA证书。安装 ca-certificates 就可以解决:

sudo apt-get install -y ca-certificates

至于错误信息中的建议:使用"--no-check-certificate"。使用https就是为了安全,直接无视就好了。

问题二:The SSL connnection could not be established

这个错误是在生产环境出现的,已经排除第一个问题。

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

错误的关键词还有:AuthenticationException: The remote cert is invalid according to the validation procedure. 简单点说就是:被访问服务的证书无效。

这里先贴出解决方案,一会再说原因。增加一个环境变量:

export DOTNET_SYSTEM_NET_HTTP_USESOCKETSHTTPHANDLER = 0

建议还是把它写到 /etc/profile 中,然后用 source /etc/profile 生效。

下面来分析下这个问题产生的原因

在微软的官方文档中可以找到关于这个配置的说明:

https://docs.microsoft.com/en-us/dotnet/api/system.net.http.socketshttphandler?view=net-6.0

https://docs.microsoft.com/zh-cn/dotnet/core/runtime-config/networking

大概就是说.NET Core 2.1之后,HttpClient内部默认使用新写的SocketsHttpHandler,但是也允许切换到之前的旧Handler,在Linux上之前使用的是CurlHandler,从这个名字上看应该是使用了libcurl这个库,这个库使用C语言写的,.NET调用的时候会有一点性能损失,所以后来.NET抛弃了libcurl,自己实现了Http网络栈的处理,也就是SocketsHttpHandler。通过设置环境变量,将Http网络栈的处理回退到了CurlHandler。

那么为什么CurlHandler可以,SocketsHttpHandler却不行呢?

在dotnet的github仓库中有一些关于这个错误的issue:

https://github.com/dotnet/runtime/issues/26494
https://github.com/dotnet/runtime/issues/35880

我这里总结核心问题就是SocketsHttpHandler验证证书域名的问题,证书的域名中大小写混合、包含下划线、使用通配符等等会导致异常,有些问题可以通过修复SocketsHttpHandler解决,有些问题是因为依赖了OpenSSL,比如OpenSSL认为域名不应该包含下划线,.NET这边遇到此类的域名就会报错,.NET也不会主动去解决。另外文中还提到旧版本的OpenSSL是没问题的,新版本的OpenSSL才这样,因为开发者认为新版本的做法更规范。.NETCore依赖的OpenSSL版本可以在这里找到:https://docs.microsoft.com/zh-cn/dotnet/core/install/linux-ubuntu#dependenciesDocs

至于我遇到的是哪个问题,因为在本地环境没有遇到这个问题,生产环境是别人去维护的,上线后也不方便去搞,所以暂时无法定位到具体原因。猜想可能有两个原因:生产环境的OpenSSL相关库版本比较新,而开发环境的OpenSSL库版本比较旧;生产环境用到的证书域名不规范,测试环境用到的证书域名规范。

还有为什么使用了CurlHandler就没有问题呢?因为我这里的curl没有依赖openssl,在银河麒麟v4中,curl依赖的是gnutls(SSL support is provided by GnuTLS.),如果已经安装了curl可以使用这个命令看它依赖的包: apt-cache depends curl 我这里显示的是:

curl
  &#x4F9D;&#x8D56;: libc6
  &#x4F9D;&#x8D56;: libcurl3-gnutls
  &#x4F9D;&#x8D56;: zlib1g

如果没有安装curl,可以看看 libcurl3-gnutls_这个包是否存在: _dpkg -s libcurl3-gnutls,如果存在这个包,则会显示它的详细信息。

最后如果你想知道自己遇到了什么错误,可以通过下边的代码来获取:

var httpClientHandler = new HttpClientHandler();
httpClientHandler.ServerCertificateCustomValidationCallback = (message, cert, chain, errors) => {
    if (errors == SslPolicyErrors.None)
    {
        return true;
    }

    // todo: 在这里输出errors到日志

    throw new AuthenticationException($"Ssl certificate validation failed when trying to connect to {message.RequestUri}, Error: {errors}.");
}

var client = new HttpClient(httpClientHandler);

以上就是本文的主要内容了,如有问题,欢迎反馈。

收获更多架构知识,请关注微信公众号 萤火架构。原创内容,转载请注明出处。
【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

Original: https://www.cnblogs.com/bossma/p/16158101.html
Author: 波斯马
Title: 国产化之银河麒麟.netcore3.1访问https服务的两个问题

相关阅读2

Title: SHH 连接远程服务器 (针对 Windows 用户)

介绍了三种SSH连接远程服务器的方式(Putty, MobaXterm, VS Code), 但仅限你的电脑是 windows 操作系统.

https://www.cnblogs.com/setdong/p/16578484.html

1. Putty

1.1 连接服务器

  1. 下载 Putty:https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html
  2. 打开 Putty
  3. 在 "Host Name" 下输入地址, 格式为 <username>@xxx.xxx.xxx</username>
  4. 点击 Open
  5. 第一次连接时可能会询问是否信任连接, 选 yes
  6. 终端打开后, 会提示你输入密码. 输入时无法看到内容, 确认无误后按下回车即可.

1.2 免密码连接服务器

  1. 打开刚刚下载的 Putty package 中的 puttygen
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
  2. 点击 "Actions" 下的 Generate button. 随意的移动鼠标指针来生成 key.

  3. 保存 "ssh-rsa xxxxxx" 一长串的字符串 (public key), 后续会用到.

  4. 点击 Save private key button, 输入文件名.

  5. 退出 puttygen

  6. 打开 putty
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
  7. go to "Connection->SSH->Auth", 点击 Browse button, 找到第4步存的private key.

  8. 返回 "Session", 在 "Host Name" 下输入地址

  9. 在 "Saved Sessions" 下输入一个名字(比如: server001), 点击 save
  10. 点击 open
  11. 终端打开, 提示输入密码
  12. 输入命令: ssh-keygen -b 2048 -t rsa, 询问地址时直接按回车, 询问密码时也直接按回车
  13. 输入命令:
    echo "" >> ~/.ssh/authorized_keys
    echo "ssh-rsa blablabla" >> ~/.ssh/authorized_keys
    替换第3步保存的"ssh-rsa xxxxxx" public key.

  14. 重启 putty, 在 "Saved Sessions" 下选择 server001, 点击 Load, 点击 Open.

2. MobaXterm

相比于 Putty, MobaXterm 提供了更友好方便的界面.

2.1 连接服务器

  1. 如果你已经用Putty连接过服务器, 此时 MobaXterm左侧会自动生成一个 "PuTTY sessions" 和 "server001", 此时点击它并输入密码即可;
    否则, 创建一个session, 点击左上角的 "Session", 选择"SSH", 在 "Remote host" 中输入地址 <username>@xxx.xxx.xxx</username>, 点击 OK button.

  2. 成功登陆后会提示是否保存密码, 免去了上述 1.2 中繁琐的免密码操作, 十分便捷.

2.2 更改终端打开时的默认路径

每次成功连接服务器后, 此时终端的当前路径往往不是你想使用的, 每次都需要 cd 到自己的文件夹下很麻烦, 可以修改默认路径来解决这个问题:

  1. 连接服务器, 在终端中输入 vim ~/.bash_profile 打开configuration file
  2. 在这个文件中添加一条 cd命令, 后接你的项目文件夹路径
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
  3. 按 Esc, 输入 :wq 退出 vim
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
  4. 再次运行 .bash_profile 文件: source ~/.bash_profile
  5. 重启终端, 输入 pwd 检查你的当前路径.

3. VS Code

VS Code 连接远程服务器后, 可以直接在 VS Code 上修改和运行代码, 很方便, 接下来介绍如何使用VS Code连接服务器和如何免密码连接.

3.1 连接服务器

  1. 点击左侧边栏内的 "Extensions" (or 按下快捷键 "Ctrl+Shift+X") , 输入搜索"Remote Development", 点击 "install" button 进行安装.

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

图1

  1. 成功安装后, 左侧边栏会多出一个 "Remote Explorer" 图标, 点击齿轮图案的 Config button
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
  2. 选择第一个文件, 填写你的服务器信息:
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
    这里的 HostName 就是前面 1.1 节第3步中的 Host Name <username>@xxx.xxx.xxx</username> 中 @ 符号后的内容(xxx.xxx.xxx), User 就是 @ 符号前的内容(
  3. 保存配置文件, 此时左侧会出现刚刚创建的机器, 如上面的图1中的 "compute_Canada".

  4. 更改设置, 依次选择 "File->Preferences->Settings->Extension->Remote-SSH", 搜索找到 "Show Login Terminal" 并勾选.

  5. 点击 "compute_Canada" 右侧的 Connect button

  6. 选择你的服务器平台类型"Linux/ Windows/macOS"
  7. 输入密码
  8. 连接成功后, 点击右侧的 + button 打开一个新的终端窗口.

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
9. 在左侧可以打开服务器的文件夹, 依次选择你的文件路径, 点击 ok
10. 此时在终端中输入 pwd, 可以看到当前路径已经定位到了刚刚打开的文件夹处. 返回刚刚进行连接服务器的窗口, 在 "compute_Canada" 下给出了刚刚打开的文件夹, 下次可以直接点击这个文件夹进行连接, 这样就省去了 2.2 小节中更改默认路径的操作.

3.2 免密码连接服务器

每次连接都需要输入密码很麻烦, 接下来介绍如何免密码连接:

  1. 在自己的电脑上打开 cmd
  2. 输入命令 ssh-keygen -t rsa -C "<username>@xxx.xxx.xxx"</username> 引号部分是你的地址, 回车
  3. 此时会依次询问你: 1) 将 key 保存在什么目录? 直接回车, 保存于它提供的默认路径(C:\Users\xxx/.ssh/id_rsa); 2) 如果已存在这个文件, 会询问是否 overwrite? 输入y, 进行覆盖; 3) 请求输入密码, 直接回车, 空密码(两次).

  4. 终端显示你的 identification 和 public key 已保存在 C:\Users\xxx/.ssh处, 进入这个文件夹可以看到有两个新增的文件 id_rsa 和 id_rsa.pub:
    【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

  5. 打开服务器的终端, 输入 ssh-keygen -b 2048 -t rsa (与1.2节第12步一样), 询问地址时直接按回车, 询问密码时也直接按回车, 若询问是否 overwrite 输入 y. 终端显示你的 identification 和 public key 已保存在 xxx/xxx/.ssh处
  6. 使用 cd 命令切换到这个文件夹, 这个文件夹中有三个文件: authorized_keys id_rsa id_rsa.pub
  7. 在你的电脑上, 打开你刚刚在第4步中创建的 id_rsa.pub 文件(即图中标为 public key 的文件), 复制文件中的内容("ssh-rsa xxxxxx" 形式的一长串字符串)
  8. 在服务器的终端上输入命令 vim authorized_keys, 将第7步复制的内容粘贴到 authorized_keys 文件中, 检查无误后按 Esc, 输入 :wq 退出 vim.

  9. 回到你的vs code, 在 3.1 节 第3步提到的 config 文件中添加 IdentityFile "C:\Users\xxx\.ssh\id_rsa", 即上述第4步提到的private key文件, 然后进行保存.

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块
10. 重启vs code, 重新连接服务器, 可以发现无需密码即可连接成功.

Original: https://www.cnblogs.com/setdong/p/16578484.html
Author: 李斯赛特
Title: SHH 连接远程服务器 (针对 Windows 用户)

相关阅读3

Title: linux添加磁盘及分区挂载

磁盘管理

1.为什么要添加磁盘

随着系统的使用,磁盘的内容会越来越少,所以这时要添加磁盘增加空间

Linux系统中磁盘管理就是将硬盘通过挂载的方式挂载到linux文件系统中。

2.系统添加磁盘并分区

挂载磁盘的步骤:

1、关机

2、添加硬盘

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

3、创建分区(开机后的操作)

fdisk /dev/sdb
或
gdisk /dev/sdb
# fdisk:分区2TB以下的磁盘,最多可以分4个分区
# gdisk:分区不限大小的磁盘,最多可以分128个分区

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

使用 : fdisk /dev/sdb命令

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

如果发现没有出现新的分区,那么可以重启一下。

4、格式化文件系统

mkfs.xfs /dev/sdb1

5、挂载

mount /dev/sdb1 /mnt(临时挂载)

【学习笔记】13.5 使用者的特殊 shell 与 PAM 模块

Original: https://www.cnblogs.com/zonghan/p/15719747.html
Author: zong涵
Title: linux添加磁盘及分区挂载