m32/endesive

Certum xades not working

sq5rix opened this issue · 12 comments

Hi
I have newest certum card.
I successfully installed the original software and all libs on Arch linux.
I can read the card in neither endesive nor PyKCS11 python.
I can read in pkcs11 lib, but only 'profil standardowy' profile.

In pkcs11 I use
os.environ['PKCS11_MODULE'] = '/opt/proCertumCardManager/sc30pkcs11-3.0.5.60-MS.so'

I tried to use both sc30pkcs11-3.0.5.60-MS.so and
dllpath = "/opt/proCertumSmartSign/libcryptoCertum3PKCS.so"

in certum examples in endesive
I failed in PyKCS11 as well...

My card:
╰─>$ pcsc_scan
Using reader plug'n play mechanism
Scanning present readers...
0: ACS ACR39U ICC Reader 00 00

Tue Nov 30 10:27:59 2021
Reader 0: ACS ACR39U ICC Reader 00 00
Event number: 0
Card state: Card inserted, Shared Mode,
ATR: 3B DD 96 FF 81 31 FE 45 80 59 5F 53 74 64 5F 49 6E 69 74 81 05 9B

ATR: 3B DD 96 FF 81 31 FE 45 80 59 5F 53 74 64 5F 49 6E 69 74 81 05 9B

  • TS = 3B --> Direct Convention
  • T0 = DD, Y(1): 1101, K: 13 (historical bytes)
    TA(1) = 96 --> Fi=512, Di=32, 16 cycles/ETU
    250000 bits/s at 4 MHz, fMax for Fi = 5 MHz => 312500 bits/s
    TC(1) = FF --> Extra guard time: 255 (special value)
    TD(1) = 81 --> Y(i+1) = 1000, Protocol T = 1

TD(2) = 31 --> Y(i+1) = 0011, Protocol T = 1

TA(3) = FE --> IFSC: 254
TB(3) = 45 --> Block Waiting Integer: 4 - Character Waiting Integer: 5

  • Historical bytes: 80 59 5F 53 74 64 5F 49 6E 69 74 81 05
    Category indicator byte: 80 (compact TLV data object)
    Tag: 5, len: 9 (card issuer's data)
    Card issuer data: 5F 53 74 64 5F 49 6E 69 74
    Tag: 8, len: 1 (status indicator)
    LCS (life card cycle): 05
  • TCK = 9B (correct checksum)

Possibly identified card (using /home/tom/.cache/smartcard_list.txt):
3B DD 96 FF 81 31 FE 45 80 59 5F 53 74 64 5F 49 6E 69 74 81 05 9B
Karta kryptograficzna cryptoCertum 3.5 (PKI)
https://www.certum.pl/pl/karty-do-czytnikow/

What am I doing wrong?
Tom

m32 commented

I have proCertumSmartSign-8.1.15 installed on my ubuntu and it works fine.

In order to check the correct installation of the readers' drivers and cards, execute the commands:
pkcs11-tool --module ./libcryptoCertum3PKCS.so -O
pkcs11-tool --module ./libcrypto3PKCS.so -O

it works!
$ pkcs11-tool --module /opt/proCertumSmartSign/libcryptoCertum3PKCS.so -O
Using slot 0 with a present token (0x1)
Public Key Object; RSA 3072 bits
label:
ID: 4b34b41070980938d50df9f1a800512766e2de4b
Usage: encrypt, verify, wrap
Access: local
Public Key Object; RSA 3072 bits
label:
ID: ddbba403527e2d6e1165af9e30b01d8c278007b3
Usage: encrypt, verify, wrap
Access: local
Public Key Object; RSA 3072 bits
label:
ID: 295474b86bcf7fb5494efd2ff95c92c28937e57f
Usage: encrypt, verify, wrap
Access: local
Public Key Object; RSA 3072 bits
label:
ID: 5e9408340e66d375f29b2fce4ddece212b281e69
Usage: encrypt, verify, wrap
Access: local
Public Key Object; RSA 3072 bits
label:
ID: 7ae0c48ae554de348ed4cb2fc026fb6b50c0a529
Usage: encrypt, verify, wrap
Access: local
Certificate Object; type = X.509 cert
label:
subject: DN: CN=Tomasz Wawer, GN=Tomasz, SN=Wawer/serialNumber=PNOPL-64072813719, C=PL
ID: 4b34b41070980938d50df9f1a800512766e2de4b

Second command:

$ pkcs11-tool --module /opt/proCertumSmartSign/libcrypto3PKCS.so -O
Using slot 0 with a present token (0x1)

What more can I check?

m32 commented

Prościej będzie po naszemu :)
Poszukaj biblioteki proCertumSmartSign-8.1.15, nie każda z nich współpracuje z openssl z dystrybucji systemu, może to jakiś problem z kompilacją pykcs11. Niestety nie mam na to innego rozwiązania jak inna wersja cryptoCertum. Na windowsie jest dokładnie to samo.
strace python3 pdf-sign-cms-hsm-certum.py pokazuje mi nieodnalezione symbole i przerywa działanie :(

To jest sprawa wersji
Najstarsza jaka jest to 8.1.25 i już coś się poprawiło:

PyKCS11.PyKCS11Error: C_GetFunctionList() not found (/opt/SimplySignDesktop/libcrypto.so.1.0.1e)

Poprosiłem support o starszą

m32 commented

libcrypto.so.1.0.1e raczej powinno być z pakietu openssl 1.0.1e, a nie z /opt/

trochę do przodu, zmieniłem biblitekę na:

dllpath = '/usr/lib/pkcs11/opensc-pkcs11.so'

i utworzyłem obiekt Signer!!

Niestety, dalej nic, w funkcji

keyid, cert = hsm.certificate()

pk11objects = self.session.findObjects([(PK11.CKA_CLASS, PK11.CKO_CERTIFICATE)])

daje None, tzn. self.session jest None

Chyba nie tędy droga...

to chyba tu jest problem:

$ opensc-tool --reader 0 --name -v
Connecting to card in reader ACS ACR39U ICC Reader 00 00...
Using card driver Default driver for unknown cards.
Card name: Unsupported card

Pytanie - jakiego uzyć drivera, bo:

$ opensc-tool --reader 0 --name -v -c /opt/proCertumCardManager/cryptoCertum3PKCS-3.0.5.61-MS.so
Driver '/opt/proCertumCardManager/cryptoCertum3PKCS-3.0.5.61-MS.so' not found!

Niestety certum nie wysłało mi proCertumSmartSign-8.1.15 bo ... nie mają...

m32 commented

stare, ale jare - to mi działa:
-rwxrwxr-x 1 mak mak 1117560 mar 31 2015 cryptoCertum3PKCS-2.0.0.43.r2-MS.so*
-rwxrwxr-x 1 mak mak 1067976 mar 31 2015 sc30pkcs11-2.0.0.39.r2-MS.so*

jutro będę miał dostęp do karty to sprawdzę o co chodzi z wersjami certuma

zerknij na sqlitebrowser/sqlitebrowser#1229
osslsigncode -pkcs11engine /usr/lib/x86_64-linux-gnu/engines-1.1/pkcs11.so -pkcs11module /opt/proCertumCardManager/sc30pkcs11-2.0.0.39.r2-MS.so -certs my_cert.spc -h sha2 -pass -in <unsigned.exe> -out <signed.exe>

m32 commented

ja mam taki błąd
src/dyn_unix.c:34:SYS_dyn_LoadLibrary() /devel/bin/proCertumSmartSign-8.1.15/libcryptoCertum3PKCS.so: undefined symbol: RSA_get0_p

m32 commented

problemem jest pakiet libssl - który jest w dwóch wersjach 1.0.0 i 1.1
musisz wybrać jeden do używania w czasie składania podpisu i w zależności od tego jak są skompilowane pakiety pythona i czego wymaga biblioteka certum to albo jest ok (stare biblioteki wymagają 1.0.0, a nowe 1.1) albo jest błąd ładowania

#!/usr/bin/env vpython3
import ctypes as ct

remove comments from lines below and try again

#libcrypto = ct.CDLL('/usr/lib/x86_64-linux-gnu/libcrypto.so.1.1', ct.RTLD_GLOBAL)
#libssl = ct.CDLL('/usr/lib/x86_64-linux-gnu/libssl.so.1.1', ct.RTLD_GLOBAL)

for name in (
'SS-8.3.3.0-dist/libcrypto3PKCS.so',
'SS-8.3.3.0-dist/libcryptoCertum3PKCS.so',
):
print(name, end ='?')
try:
dll = ct.CDLL(name)
print('ok')
except Exception as why:
print('fail, why=', why)

dzięki walczę...

m32 commented

zobacz w poprawionych przykładach