On 02/10/2010 11:07 AM, Andreas Jellinghaus wrote: > ok, let me phrase it that way: > a typical card has certificates - non-authoritative belong to > the user, authoritatives are part of the chain to the root ca. > normal cards don't have rsa public keys. > normal cards have a private rsa keys for each user certificate. > normal cards need a pin before the private rsa key is visible.
Right, i understand this; but the certificates themselves contain public
keys, so the one thing held in common by all these cards is that they
publish a public key in some form (whether embedded in a certificate or
as a raw public key).
> so what pam_p11 does is match the certificates or rsa public
> key in whatever file against the certificates (or rsa public
> key inside the certificate). only if it finds a match, it will
> ask for the pin, and then make sure there is a private key
> that can sign some random data, and verifiy that signature.
understood.
> switching from looking to certificate to _INSTEAD_ look
> for public rsa keys only would be a grave mistake, as
> many cards have no public rsa keys (well, with some
> cards opensc emulates those, but other pkcs#11 libs
> don't do that). so with typical cards it will no longer
> work.
my point was simply that the cards which publish certificates *do*
publish public keys -- they're just wrapped up in the X.509 certificates.
> you could extend the code, to look also for public keys.
> but that will only work with some cards, and only with
> the _openssl module.
What is the _openssl module? do you mean pam_p11_openssh ?
> while it might be a nice solution
> cards with a public rsa key, but without certificates
> (opensc can create those), I don't think many cards like
> that are around.
The amount of storage space on my eGate appears to be such that if it
contains two 2048-bit RSA secret keys, it can only fit one certificate.
since public keys are smaller than certificates, it turns out that it
can store two public keys.
>> pam_p11 currently appears to ignore everything in A (e.g. it doesn't
>> care about the expiration date on the cert, the extensions, the issuer,
>> etc), and cares only about B.
>
> IIRC only for the _openssh module, but not 100% sure.
i'm only using pam_p11_opensc, actually, not _openssh. My point is not
that pam_p11 is using a raw public key as a data structure -- it's
clearly currently using an X.509 certificate as the data structure,
*not* a raw public key. But for the purposes of authentication, it is
ignoring all of the material in that data structure except for the
public key.
>> It asks: can the plugged-in-device, in
>> conjunction with the user-supplied PIN, produce a successful RSA
>> response from the associated private key?
>
> no, it first tries to guess, if there is a matching private key on
> the card. and the way to do that is to look for a matching certificate
> with the public rsa key part in it. public rsa key objects only exist
> with some cards.
right, i understand this.
> so having a debian bug about this possibility is kind of pointless.
> if you send a clean and nice patch to add such functionality, I can
> apply it and release a new version. but since you are the first
> user in ages to ask for such an uncommon feature, it is unlikely anyone
> else will implement it, unless you do it yourself.
that's fair enough -- and it's actually been on my list of things to
look into doing for a while (though my plate is pretty full at the
moment). Would you prefer i file a bug with some upstream bugtracker as
well to keep it on a list we could both refer to?
>> In fact, that would be a bad idea on my particular device, because i
>> have two keys on it. It's important that the authorized public key be
>> matched against a particular authentication slot (PIN) on the card and
>> be able to test that the supplied PIN enables the card to produce a
>> successful RSA response from the expected private key. We don't want to
>> blindly try all authentication slots.
>
> well, the code should only ask for a pin and use it, if the slot contains
> a matching ceritificate. so I don't see any "blindly try all authentication
> slots".
i agree, it's not blindly trying right now, and that's good. You seemed
to suggest that was what i wanted to do, and i was trying to explain
that i did not want to do that.
> yes, we could add an option to limit the pam module to some slot. haven't
> had a request for it so far, patches welcome. also for alternative locations
> for those files (the file names implemented are simply the old file names
> that had been implemented by old modules preceeding pam_p11)...
i don't want an option to hard-bind the pam module to a given slot. i
think that would be a mistake. the current approach of choosing a slot
based on the acceptable cryptographic authentication material is the
right one.
> the current code is simple, allowing more is adding complexity.
> if people need more features, they can be added, but so far the code
> was small and simple and worked without much work.
yes, and i appreciate it! I'd like to simplify it further conceptually
by throwing away the requirements for X.509, since pam_p11 doesn't
actually use any information about them.
All spelled out, my proposal is:
* the filesystem can supply certificates, certificate requests, or raw
public keys in ~/.eid/authorized_certificates
* pam_p11 extracts the RSA public key from these, to create a set of
public keys.
* the card produces a set of public keys bound to authentication slots,
either embedded in X.509 certificates or as raw public keys.
* the system finds the first public key which is in both sets, and asks
the user to authenticate to the corresponding slot on the card
* the system grants the authentication based on whether the card can
properly compute the response to the RSA challenge using the
user-supplied PIN.
Does that make it clearer? I probably should have written it up like
that earlier.
> also there is a much bigger and more complex alternative to pam_p11:
> pam_pkcs11. it has modules, does CA chain certificateion, can check
> if certiifcates are expired or revoked, can lookup ldap etc.
yeah, i'm not using pam_pkcs11 because the X.509 hierarchical trust
model doesn't match the way i think that cryptographic trust should
work. I much prefer the simpler model offered by pam_p11, which can be
used as a backend for various other trust models.
> so I'm not sure how much complexity added to pam_p11 would still be good,
> or when users would be better off with using pam_pkcs11. the whole point
> of pam_p11 is: it is dead simple.
agreed, which is why the X.509 trimmings that aren't actually used by
the authentication process shouldn't be required. Keep the
authentication simple: proving that you have control over the secret
counterpart to a given public key should be sufficient. i *don't* want
to see pam_p11 embed or require all the X.509 craziness.
> so what do you think is best to do?
I'd like to leave this bug open (possibly forwarding it to an upstream
tracker if you like) until we have a chance to get it sorted out. I
understand that might mean me doing the work, and i don't mind that.
Thanks for having this discussion, and thanks for pam_p11! I hope it's
understood that my suggestions and contributions here are meant
constructively, not just whining.
Regards,
--dkg
signature.asc
Description: OpenPGP digital signature

