2017-06-19 24 views
5

मैं Microsoft से कुछ JWTs के हस्ताक्षर सत्यापित करने के लिए इच्छुक रहा हूँ का उपयोग कर। मैं स्प्रिंग-बूट, जेजेडब्ल्यूटी लाइब्रेरी और निम्नलिखित एंडपॉइंट का उपयोग कर रहा हूं: https://login.microsoftonline.com/common/discovery/v2.0/keysसत्यापन जेडब्ल्यूटी हस्ताक्षर सार्वजनिक कुंजी endpoint

एंडपॉइंट JSON सार्वजनिक कुंजी की एक सरणी देता है। यहां सरणी से एक उदाहरण है।

{ 
      "kty": "RSA", 
      "use": "sig", 
      "kid": "9FXDpbfMFT2SvQuXh846YTwEIBw", 
      "x5t": "9FXDpbfMFT2SvQuXh846YTwEIBw", 
      "n": "kvt1VmR4nwkNM8jMU0wmj2gSS8NznbOt2pZI6Z7HQT_esF7W19GZR7Y72Xo1i5zXRDM9o3GeTIjBrnr3yy41Q_EaUQ7C-b-Hmg94Vy7EBZyBhi_mznz0dYWs2MIXwR86Nni9TmgTXvjgTPF2YGJoZt4TwcMFefW8rijCVyNrCBA0XspDouNJavvG0BEMXYigoThFjLRXS5U3h4BDfNZFZZS3dyliNOXfgRn2k7oITz8h_ueiPvmDRFh38AeQgx1cELhKWc3P5ugtttraSwgH7nP2NUguO9nCrHuL6TZ-KWpmRWZqwH-jYKFQVt3CDpzwNM6XJL-oHbl1x-gI3YYX5w", 
      "e": "AQAB", 
      "x5c": [ 
       "MIIDBTCCAe2gAwIBAgIQZSAeaqWig4BHC1ksmNNcgjANBgkqhkiG9w0BAQsFADAtMSswKQYDVQQDEyJhY2NvdW50cy5hY2Nlc3Njb250cm9sLndpbmRvd3MubmV0MB4XDTE3MDUwNjAwMDAwMFoXDTE5MDUwNzAwMDAwMFowLTErMCkGA1UEAxMiYWNjb3VudHMuYWNjZXNzY29udHJvbC53aW5kb3dzLm5ldDCCASIwDQYJKoZIhvcNAQEBBQADggEPADCCAQoCggEBAJL7dVZkeJ8JDTPIzFNMJo9oEkvDc52zrdqWSOmex0E/3rBe1tfRmUe2O9l6NYuc10QzPaNxnkyIwa5698suNUPxGlEOwvm/h5oPeFcuxAWcgYYv5s589HWFrNjCF8EfOjZ4vU5oE1744EzxdmBiaGbeE8HDBXn1vK4owlcjawgQNF7KQ6LjSWr7xtARDF2IoKE4RYy0V0uVN4eAQ3zWRWWUt3cpYjTl34EZ9pO6CE8/If7noj75g0RYd/AHkIMdXBC4SlnNz+boLbba2ksIB+5z9jVILjvZwqx7i+k2filqZkVmasB/o2ChUFbdwg6c8DTOlyS/qB25dcfoCN2GF+cCAwEAAaMhMB8wHQYDVR0OBBYEFGKpXQNrF5IoxS6bL4F92+gxOJlIMA0GCSqGSIb3DQEBCwUAA4IBAQA3HgW5SoHlvvQVxqqi+mtscDZLhNfe13iG/nx8Er5il82b79RVydNs+f9sYxc4T4ctnrZu7x5e7jInJedNdAlrPorBdw+SfvKJsmiNndXugMew1FlcQTQVIFDCbziaJav8rKyMxPfeKkc1aixbajWZkKg6OPmmJn2ceTocbn8PMQy20xNvcWUwgF5FZZIuPqu6feOLJcUIYw+0JFZ265xka30QXpmytcIxajIzpD4PRdCIBuVSqgXacAs4t4+w+OhnosD72yvXck8M4GwX1j+vcuyw0yhDGNMmqsHWP7H3jnJiGDrKhhdVyplzDhTfv2Whbv/dIDn+meLE3yyC5yGL" 
      ], 
      "issuer": "https://login.microsoftonline.com/{tenantid}/v2.0" 
     } 

JJWT में मैं SigningKeyResolver इंटरफ़ेस को क्रियान्वित किया है और मैं RSAPublicKey का एक उदाहरण वापस जाने के लिए सत्यापन करने के लिए आवश्यक कर रहा हूँ। जो समस्या मैं कर रहा हूं वह JSON से सही ढंग से कुंजी बना रहा है।

क्या मैं मॉड्यूलस और एक्सपोनेंट से शुरू करता हूं?

BigInteger modulus = new BigInteger(1, Base64.decodeBase64(jsonKey.getN())); 
BigInteger exponent = new BigInteger(1, Base64.decodeBase64(jsonKey.getE())); 
publicKey = KeyFactory.getInstance("RSA").generatePublic(new RSAPublicKeySpec(modulus, exponent)); 

क्या मैं x5c से शुरू करता हूं, X509 प्रमाण पत्र ऑब्जेक्ट उत्पन्न करता हूं और वहां से पब्लिककी खींचता हूं?

CertificateFactory factory = CertificateFactory.getInstance("X.509"); 
X509Certificate cert = (X509Certificate) factory.generateCertificate(new ByteArrayInputStream(DatatypeConverter.parseBase64Binary(jsonKey.getX5c()))); 
publicKey = (RSAPublicKey)cert.getPublicKey(); 

दोनों दृष्टिकोण निरर्थक साबित हुए हैं।

अगर मैं मापांक और प्रतिपादक से RSAPublicKey उत्पन्न मैं Base64Binary इनकोडिंग कुंजी x5c संपत्ति मैच के लिए मुद्रित करने में सक्षम होना चाहिए? शायद ऐसा नहीं है कि मुझे कैसे वैध होना चाहिए।

मुझे इसका उपयोग करने के लिए गलतफहमी हो सकती है।

हमेशा की तरह, किसी भी प्रलेखन के साथ-साथ की सराहना की है।

+3

साथ मैं मानक पता नहीं है, लेकिन स्पष्ट रूप से मापांक "n" और सार्वजनिक प्रतिपादक है "ई"। x5c एक x509 प्रमाणपत्र की तरह दिखता है। संपादित करें: [यहां] (https://tools.ietf.org/html/rfc7517) कल्पना प्रतीत होता है। –

+0

दरअसल ऐसा लगता है कि दूसरा दृष्टिकोण काम करता है, संभवतः क्योंकि यह पूर्ण प्रमाणपत्र श्रृंखला है। ई, एन और एक्स 5 सी के बीच संबंध अभी भी अस्पष्ट है क्योंकि यह उस अंतराल से वापस आ गया है। मैं अन्य अंत बिंदुओं को केवल प्रमाण श्रृंखला शामिल करता हूं। सार्वजनिक कुंजी के आसपास माइक्रोसॉफ्ट दस्तावेज नहीं मिला। –

उत्तर

2

x5c प्रमाणीकरण श्रृंखला में शामिल है। श्रृंखला के पहले प्रमाण पत्र इस मामले n और e, इसलिए सार्वजनिक कुंजी x5c[0] से निकाली गई है, JWK में अन्य मूल्यों का प्रतिनिधित्व करती कुंजी मान के साथ मेल खाना चाहिए और एक n और e के साथ बनाया गया ठीक उसी

होना चाहिए

JWK मूल्यों, base64url में इनकोड बेस 64 में नहीं है।

BigInteger modulus = new BigInteger(1, Base64.decodeBase64(jsonKey.getN())); 
BigInteger exponent = new BigInteger(1, Base64.decodeBase64(jsonKey.getE())); 

बदलें

BigInteger modulus = new BigInteger(1, Base64.getUrlDecoder().decode(jsonKey.getN())); 
BigInteger exponent = new BigInteger(1, Base64.getUrlDecoder().decode(jsonKey.getE())); 
+0

इससे मदद मिलती है! मॉड्यूलस और एक्सपोनेंट प्रमाण पत्र श्रृंखला में पहले प्रमाण पत्र की सार्वजनिक कुंजी से मेल खाता है। हस्ताक्षर को सत्यापित करने के लिए पूरी श्रृंखला की आवश्यकता है, न केवल मॉड और एक्सप के रूप में, क्योंकि मैं शुरुआत में कोशिश कर रहा था। –

संबंधित मुद्दे