![无法使用 pkcs#11 模块登录 ubuntu](https://linux22.com/image/1481096/%E6%97%A0%E6%B3%95%E4%BD%BF%E7%94%A8%20pkcs%2311%20%E6%A8%A1%E5%9D%97%E7%99%BB%E5%BD%95%20ubuntu.png)
使用 pkcs#11 模块,我们无法登录 ubuntu 操作系统。为此,我们参考了: http://ubuntuforums.org/showthread.php?t=1557180 https://opensc.github.io/pam_pkcs11/doc/pam_pkcs11.html#idp2059072
尝试使用 pkcs#11 共享库登录时,遇到以下错误:
ubuntu kernel: [13342.185619] lightdm[15882]: segfault at b662b48e ip b71ddd2f sp bfb35dec error 4 in libc-2.19.so[b7163000+1a8000]
退出 C_Finalize 后出现此错误(使用 syslog 跟踪)..
登录时屏幕显示类似以下信息:
Smartcard authentication starts, Smart card found, verifying certificate, Failed to authenticate
当尝试通过终端从默认用户登录其他用户时 - 能够到达authentication succeeded
终点(在终端中出现分段错误之前)并获取错误(根据系统日志) -
ubuntu kernel: [11694.542754] su[13543]: segfault at b676048e ip b7586d2f sp bfd0f0bc error 4 in libc-2.19.so[b750c000+1a8000]
pam 没有问题。因为我们已经用其他令牌测试过了,它能正常工作。当我们尝试使用带有 backtrace 选项的 gdb 调试它时,结果将是这样的-
程序收到信号 SIGSEGV,分段错误。__strlen_ia32()位于 ../sysdeps/i386/i686/multiarch/.././i586/strlen.S:51 51 ../sysdeps/i386/i686/multiarch/.././i586/strlen.S:没有此文件或目录。(gdb)回溯
#
0 __strlen_ia32()位于../sysdeps/i386/i686/multiarch/../../i586/strlen.S:51
#
1 0xb7597732 在 __GI_fputs_unlocked ( str=0xb678248e , fp=fp@entry=0x8fd4d20 )中,位于 iofputs_u.c:36
#
2 0xb7614789 在 __GI___vsyslog_chk (pri=, pri@entry=85, flag=flag@entry=1, fmt=fmt@entry=0xb76ebb7e "%s %s", ap=ap@entry=0xbfe56b4c "\270K\375\b\030/\375\b\264\252n\267") 位于 ../misc/syslog.c:205
#
3 0xb7614c27 在 __syslog_chk (pri=85, flag=1, fmt=0xb76ebb7e "%s %s") 中位于 ../misc/syslog.c:129
#
4 0xb76e8a4c 在 pam_vsyslog () 中来自 /lib/i386-linux-gnu/libpam.so.0
#
5 0xb76e8b93 在 pam_syslog () 中来自 /lib/i386-linux-gnu/libpam.so.0
#
6 0xb6884e38 在 ?? () 来自 /lib/i386-linux-gnu/security/pam_unix.so
#
7 0xb68823d4 在 pam_sm_authenticate () 中来自 /lib/i386-linux-gnu/security/pam_unix.so
#
8 0xb76e35af 在 ?? () 来自 /lib/i386-linux-gnu/libpam.so.0
#
9 0xb76e2c7a 在 pam_authenticate () 中来自 /lib/i386-linux-gnu/libpam.so.0
#
10 0x0804b3ba 在 ?? ()
#
11 0x08049e66 在 ?? ()
#
12 0xb7547a83 在 __libc_start_main (main=0x8049a50, argc=1, argv=0xbfe56e54, init=0x804db50, fini=0x804dbc0, rtld_fini=0xb771a180 <_dl_fini>, stack_end=0xbfe56e4c) 位于 libc-start.c:287
#
13 0x0804ab6c 在 ?? ()
(gdb)框架 10
#
10 0x0804b3ba 在 ??()
(gdb) 框架 12
#
12 0xb7547a83 位于 __libc_start_main (main=0x8049a50、argc=1、argv=0xbfe56e54、init=0x804db50、fini=0x804dbc0、rtld_fini=0xb771a180 <_dl_fini>、stack_end=0xbfe56e4c) 在 libc-start.c:287 287 libc-start.c:没有此文件或目录。
(gdb) 框架 12
#
12 0xb7547a83 在 __libc_start_main (main=0x8049a50, argc=1, argv=0xbfe56e54, init=0x804db50, fini=0x804dbc0, rtld_fini=0xb771a180 <_dl_fini>, stack_end=0xbfe56e4c) 在 libc-start.c:287 287 在 libc-start.c (gdb) q
有人能告诉我调试这种错误的过程吗?因为在这个回溯中没有与我们的代码(PKCS#11 库)相关的文件
注意:除了我们的共享图书馆之外,我们还使用智能卡进行登录。
答案1
问题出在跟踪语句中。我们在跟踪中内部调用了 syslog(),这里由于没有关闭日志(即缺少 closelog())而引发了错误。现在模块没有问题了。