Open Bug 1319000 Opened 8 years ago Updated 2 years ago

Cache of database is broken in the case of same subjects and different nickname.

Categories

(NSS :: Libraries, defect, P3)

3.27

Tracking

(Not tracked)

UNCONFIRMED

People

(Reporter: fryasu, Unassigned)

References

(Blocks 1 open bug)

Details

Attachments

(2 files)

User Agent: Mozilla/5.0 (X11; Fedora; Linux x86_64; rv:49.0) Gecko/20100101 Firefox/49.0
Build ID: 20161031141208

Steps to reproduce:

When the two certificates which has same subject and different issuer are imported with different nickname, 
results of PK11_FindCertFromNickname() differ between the first time and the second time.

STEP1. creating two CAs
  $ openssl genrsa 2048 > pki/ca1/ca.key
  $ openssl req -new -x509 -key pki/ca1/ca.key -out pki/ca1/ca.crt -days 365 -subj "/CN=CA1"

  $ openssl genrsa 2048 > pki/ca2/ca.key
  $ openssl req -new -x509 -key pki/ca2/ca.key -out pki/ca2/ca.crt -days 365 -subj "/CN=CA2"

STEP2. creating two certificates with same subject with each CAs.
  $ openssl genrsa 2048 > pki/server1.key
  $ openssl req -subj "/CN=server" -new -key pki/server1.key > pki/server1.csr
  $ openssl ca -days 3650 -subj "/CN=server" -keyfile pki/ca1/ca.key -cert pki/ca1/ca.crt -in pki/server1.csr -batch > pki/server1.crt
  $ openssl x509 -in pki/server1.crt -noout -text |grep -e Subject: -e Issuer:
        Issuer: CN=CA1
        Subject: CN=server

  $ openssl genrsa 2048 > pki/server2.key
  $ openssl req -subj "/CN=server" -new -key pki/server2.key > pki/server2.csr
  $ openssl ca -days 3650 -subj "/CN=server" -keyfile pki/ca2/ca.key -cert pki/ca2/ca.crt -in pki/server2.csr -batch > pki/server2.crt
  $ openssl x509 -in pki/server2.crt -noout -text |grep -e Subject: -e Issuer:
        Issuer: CN=CA2
        Subject: CN=server

STEP3. Imports each certificate with different nickname.
  $ certutil -d sql:pki/nss -N --empty-password
  $ certutil -d sql:pki/nss -E -i pki/server1.crt -n server1 -t u,u,u
  $ certutil -d sql:pki/nss -E -i pki/server2.crt -n server2 -t u,u,u
  $ certutil -d sql:pki/nss -L
  Certificate Nickname                                         Trust Attributes
  server1                                                      ,,   
  server2                                                      ,,

STEP4. Please build the attached test code which is PK11_FindCertFromNickname() loop.
  $ gcc -Wall -std=gnu99 -Wall nsstest_PK11_FindCertFromNickname.c -o nsstest_PK11_FindCertFromNickname \
     -I /usr/include/nss3/ -I /usr/include/nspr4/ -lnss3 -lnspr4

STEP5. Runs the test
  $ ./nsstest_PK11_FindCertFromNickname sql:pki/nss/ server1 server2
  ---- [0] first loop -----
  -  in: nickname='server1'
  - out: nickname='server1' (0x...9b0), Subject='CN=server', Issuer='CN=CA1'
	   OK

  -  in: nickname='server2'
  - out: nickname='server2' (0x...210), Subject='CN=server', Issuer='CN=CA2'
	   OK

  ---- [1] second loop (after cached) -----
  -  in: nickname='server1'
  - out: nickname='server2' (0x...210), Subject='CN=server', Issuer='CN=CA2'
	  *ERR*

  -  in: nickname='server2'
  - out: nickname='server2' (0x...210), Subject='CN=server', Issuer='CN=CA2'
	   OK

We doubt nss/lib/pki/tdcache.c behavior.


Actual results:

In the first loop, PK11_FindCertFromNickname("server1") returns the "server1" certificate.

But in the second loop, PK11_FindCertFromNickname("server1") returns the unexpected "server2" certificate.


Expected results:

the result of second loop shoud be same with first loop's.
Priority: -- → P3
We could make the small patch, we'll be happy if it will
be of any help.

About cache handling, the following correction was added.

    before: share the values among the subject cache
            and nickname cache.

     after: make the nickname cache indepent from
            the subject cache.

    target:
      - remove_nickname_entry()
      - add_nickname_entry()

because it's necessary of the reverse resolution from
certificate to nickname, also following is corrected.

    before: from one certificate, acquire the entry of
            subject cache, and acquires the nickname
	    from this entry.

     after: acquires the nickname from cache of issuer+serial_no
            cache.

     target:
       - remove_subject_to_cache()
       - add_subject_to_cache()
       - remove_issuer_and_serial_entry()
       - add_issuer_and_serial_entry()

best regards,
Severity: normal → S3
You need to log in before you can comment on or make changes to this bug.

Attachment

General

Creator:
Created:
Updated:
Size: