PKCS#12 est un format de fichier (souvent appelé .p12 ou .pfx) dans lequel vous pouvez stocker une clé privée et des certificats. Il est utilisé pour convertir/transférer des clés et des certificats, principalement. Si vous exportez une clé privée + un certificat à partir de votre navigateur, il est probable que ce sera dans ce format.
PKCS#11 est une interface, généralement utilisée pour parler aux jetons cryptographiques matériels (souvent des cartes à puce ou des jetons USB, qui sont effectivement des cartes à puce intégrées dans un lecteur). Cette interface comporte un certain nombre d'opérations permettant d'utiliser les clés et les certificats. Certains jetons sont capables de signer en utilisant la clé privée qu'ils contiennent, sans que la clé puisse quitter le dispositif. L'intérêt de cette interface est de traiter ce qui gère les clés et les certificats comme une entité séparée, sans avoir à effectuer les opérations cryptographiques qu'offre le PKCS#11 (plus précisément, celles liées à la clé privée).
Lorsque vous utilisez PKCS#11 avec NSS, vous utilisez effectivement NSS comme une boîte noire enveloppée derrière la couche PKCS#11 (c'est effectivement un fournisseur logiciel pour ce que serait un jeton matériel PKCS#11). Il y a une légère différence dans la façon dont Java utilise NSS via PKCS#11 dans la mesure où il ne nécessite pas de bibliothèque partagée PKCS#11 (par rapport aux autres bibliothèques PKCS#11), donc en tant que tel, ce n'est pas PKCS#11 à proprement parler, bien que ce soit très similaire.
En Java, il est possible d'obtenir un fichier RSAPrivateKey
à partir d'un magasin PKCS#11, l'utiliser pour signer et déchiffrer, sans jamais pouvoir obtenir quoi que ce soit de son module. Le fournisseur de sécurité qui la gère effectuera la signature et le déchiffrement via la bibliothèque (et donc via le jeton, si cette bibliothèque est prise en charge par un jeton matériel).
Pour en revenir à la KeyStore
En Java, il s'agit d'une API qui peut vous permettre de charger et d'utiliser des clés et des certificats à partir de fichiers (vous obtenez divers formats de fichiers tels que JKS, PKCS#12, PEM, en fonction de votre fournisseur de sécurité) ou à partir d'autres API sous-jacentes (telles que PKCS#11, plus ou moins fusionnée avec NSS dans le fournisseur Sun, ou le KeychainStore si vous êtes sous OSX et que vous voulez utiliser la KeyChain comme KeyStore).