אימות X.509 באבטחת אביב

1. סקירה כללית

במאמר זה נתמקד במקרי השימוש העיקריים לאימות אישור X.509 - אימות זהותו של עמית תקשורת בעת שימוש בפרוטוקול HTTPS (HTTP over SSL).

במילים פשוטות - בזמן שנוצר חיבור מאובטח, הלקוח מאמת את השרת על פי האישור שלו (מונפק על ידי רשות אישורים מהימנה).

אבל מעבר לכך, ניתן להשתמש ב- X.509 באבטחת אביב לאמת את זהות הלקוח על ידי השרת בזמן החיבור. זה נקרא "אימות הדדי", ונראה איך זה נעשה גם כאן.

לסיום ניגע כאשר הגיוני להשתמש באימות מסוג זה.

כדי להדגים אימות שרתים, ניצור יישום אינטרנט פשוט ונתקין רשות אישורים מותאמת אישית בדפדפן.

יתר על כן, עבור אימות הדדי, ניצור אישור לקוח ונשנה את השרת שלנו כדי לאפשר רק לקוחות מאומתים.

מומלץ מאוד לעקוב אחר ההדרכה שלב אחר שלב וליצור את האישורים, כמו גם את חנות המפתח וחנות הנאמנות בעצמך, בהתאם להוראות המוצגות בסעיפים הבאים. עם זאת, את כל הקבצים המוכנים לשימוש ניתן למצוא במאגר GitHub שלנו.

2. שורש חתימה עצמית CA

כדי שנוכל לחתום על אישורי צד השרת שלנו וצד הלקוח, עלינו ליצור תחילה את אישורי ה- CA הבסיסיים שלנו בחתימה עצמית. בדרך זו נפעל כרשות האישורים שלנו.

לשם כך נשתמש בספריית openssl, לכן עלינו להתקין אותה לפני ביצוע השלב הבא.

בואו ניצור כעת את אישור ה- CA:

ביקורת openssl -x509 -sha256 -ימים 3650-מפתח חדש rsa: 4096-keyout rootCA.key -out rootCA.crt

כאשר אנו מבצעים את הפקודה הנ"ל, עלינו לספק את הסיסמה עבור המפתח הפרטי שלנו. לצורך הדרכה זו אנו משתמשים שנה את זה כמשפט סיסמה.

בנוסף, עלינו להזין מידע שיוצר שם מכובד. כאן אנו מספקים רק את ה- CN (שם נפוץ) - Baeldung.com - ומשאירים חלקים אחרים ריקים.

3. קייסטור

דרישה אופציונלית: כדי להשתמש במפתחות חזקים בהצפנה יחד עם תכונות הצפנה ופענוח נצטרך את "Java Cryptography Extension (JCE) קבצי מדיניות שיפוט חוזק ללא הגבלה”מותקן ב- JVM שלנו.

אלה ניתן להוריד למשל מאורקל (עקוב אחר הוראות ההתקנה הכלולות בהורדה). חלק מהפצות לינוקס מספקות גם חבילה הניתנת להתקנה דרך מנהלי החבילות שלהם.

מחסן מפתחות הוא מאגר שבו יישום Spring Boot שלנו ישתמש בכדי להחזיק את המפתח הפרטי ואישורו. במילים אחרות, היישום שלנו ישתמש בחנות המפתחות כדי להגיש את האישור ללקוחות במהלך לחיצת היד SSL.

במדריך זה אנו משתמשים ב- פורמט Java Key-Store (JKS) וכלי שורת פקודה keytool.

3.1. תעודה בצד השרת

כדי ליישם את אימות ה- X.509 בצד השרת ביישום Spring Boot, אנו ראשית צריך ליצור אישור בצד השרת.

נתחיל ביצירת מה שמכונה בקשת חתימת אישורים (CSR):

openssl req -new -newkey rsa: 4096 -keyout localhost.key –out localhost.csr

באופן דומה, באשר לאישור ה- CA, עלינו לספק את הסיסמה עבור המפתח הפרטי. בנוסף, בואו נשתמש מארח מקומי כשם נפוץ (CN).

לפני שנמשיך, עלינו ליצור קובץ תצורה - localhost.ext. זה יאחסן כמה פרמטרים נוספים הדרושים במהלך חתימת האישור.

AuthorityKeyIdentifier = keyid, מנפיק basicConstraints = CA: FALSE subjectAltName = @ alt_names [alt_names] DNS.1 = localhost

קובץ מוכן לשימוש זמין גם כאן.

עכשיו הגיע הזמן חתום על הבקשה באמצעות שלנו rootCA.crt תעודה והמפתח הפרטי שלה:

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in localhost.csr -out localhost.crt -days 365 -CAcreateserial -extfile localhost.ext

שים לב שעלינו לספק את אותה סיסמה בה השתמשנו כשיצרנו את תעודת ה- CA שלנו.

בשלב זה, סוף סוף יש לנו מוכן לשימוש localhost.crt תעודה חתומה על ידי רשות האישורים שלנו.

כדי להדפיס את פרטי האישור שלנו בצורה קריאה אנו יכולים להשתמש בפקודה הבאה:

openssl x509 -in localhost.crt -text

3.2. ייבא לקייסטור

בחלק זה נראה כיצד לעשות זאת ייבא את האישור החתום ואת המפתח הפרטי המתאים ל- keystore.jks קוֹבֶץ.

נשתמש בארכיון PKCS 12 כדי לארוז את המפתח הפרטי של השרת שלנו יחד עם האישור החתום. ואז נייבא אותו ליצירה החדשה keystore.jks.

אנו יכולים להשתמש בפקודה הבאה כדי ליצור .p12 קוֹבֶץ:

openssl pkcs12 -export -out localhost.p12 -name "localhost" -inkey localhost.key -in localhost.crt

אז עכשיו יש לנו את localhost.key וה localhost.crt ארוז בסינגל localhost.p12 קוֹבֶץ.

בואו עכשיו נשתמש ב- keytool כדי ליצור keystore.jks מאגר וייבא את localhost.p12 קובץ עם פקודה אחת:

keytool -importkeystore -srckeystore localhost.p12 -srcstoretype PKCS12 -destkeystore keystore.jks -estestoretype JKS

בשלב זה, יש לנו הכל במקום חלק לאימות השרת. בואו נמשיך בתצורת היישום Spring Boot שלנו.

4. יישום לדוגמא

פרויקט השרת המאובטח SSL שלנו מורכב מ- @ SpringBootApplication מחלקת יישומים מוסברת (שהיא סוג של @תְצוּרָה), application.properties קובץ תצורה וחזית ממשית בסגנון MVC פשוט מאוד.

כל מה שהיישום צריך לעשות הוא להציג דף HTML עם "שלום {משתמש}!" הוֹדָעָה. בדרך זו אנו יכולים לבדוק את אישור השרת בדפדפן כדי לוודא שהחיבור מאומת ומאובטח.

4.1. תלות Maven

ראשית, אנו יוצרים פרויקט חדש של Maven עם שלושה חבילות Spring Boot Starter כלולות:

 org.springframework.boot spring-boot-starter-security org.springframework.boot spring-boot-starter-web org.springframework.boot spring-boot-starter-thymeleaf 

להשוואה: אנו יכולים למצוא את החבילות ב- Maven Central (אבטחה, אינטרנט, thymeleaf).

4.2. יישום אתחול האביב

כשלב הבא, אנו יוצרים את מחלקת היישומים הראשית ואת בקר המשתמש:

@SpringBootApplication מחלקה ציבורית X509AuthenticationServer {main public static void (String [] args) {SpringApplication.run (X509AuthenticationServer.class, args); }} @Controller מחלקה ציבורית UserController {@RequestMapping (value = "/ user") public user String (Model Model, Principal Principal) {UserDetails currentUser = (UserDetails) ((Authentication) principal) .getPrincipal (); model.addAttribute ("שם משתמש", currentUser.getUsername ()); להחזיר "משתמש"; }}

עכשיו, אנו אומרים ליישום היכן למצוא את שלנו keystore.jks ואיך לגשת אליו. הגדרנו SSL לסטטוס "מופעל" ומשנה את יציאת ההאזנה הסטנדרטית ל לציין חיבור מאובטח.

בנוסף, אנו מגדירים חלקם פרטי המשתמש לגישה לשרת שלנו באמצעות אימות בסיסי:

server.ssl.key-store = .. / store / keystore.jks server.ssl.key-store-password = $ {PASSWORD} server.ssl.key-alias = localhost server.ssl.key-password = $ {PASSWORD } server.ssl.enabled = true server.port = 8443 spring.security.user.name = Admin spring.security.user.password = admin

זו תהיה תבנית ה- HTML הממוקמת ב משאבים / תבניות תיקיה:

   הדגמת אימות X.509 

שלום !

4.3. התקנת שורש CA

לפני שנסיים את החלק הזה ונסתכל באתר, עלינו להתקין את רשות אישורי השורש שנוצרה כאישור מהימן בדפדפן.

התקנה למופת של רשות האישורים שלנו עבור Mozilla Firefox ייראה כך:

  1. סוּג אודות: העדפות בשורת הכתובת
  2. לִפְתוֹחַ מתקדם -> אישורים -> הצג אישורים -> רשויות
  3. לחץ על יְבוּא
  4. אתר את מדריכי באלדונג תיקייה ותיקיית המשנה שלה אביב-אבטחה-x509 / keystore
  5. בחר את rootCA.crt הקובץ ולחץ בסדר
  6. בחר "סמכו על רשות אישורים זו שתזהה אתרים ” ולחץ בסדר

הערה: אם אתה לא רוצה להוסיף את שלנו רשות אישורים לרשימת רשויות מהימנותמאוחר יותר תהיה לך אפשרות לבצע יוצא מן הכלל ולהראות לאתר קשוח, גם כשהוא מוזכר כלא בטוח. אבל אז תראה סמל 'סימן קריאה צהוב' בשורת הכתובת, המציין את הקשר הלא בטוח!

לאחר מכן, ננווט אל ה- אביב-אבטחה-x509-basic-auth מודול והפעל:

קפיץ אתחול mvn: לרוץ

לבסוף, פגענו // localhost: 8443 / משתמש, הזן את אישורי המשתמש שלנו מה- application.properties וצריך לראות א "שלום מנהל!" הוֹדָעָה. כעת אנו יכולים לבדוק את מצב החיבור על ידי לחיצה על סמל "נעילה ירוקה" בשורת הכתובת, וזה אמור להיות חיבור מאובטח.

5. אימות הדדי

בחלק הקודם הצגנו כיצד ליישם את סכמת אימות SSL הנפוצה ביותר - אימות בצד השרת. המשמעות היא שרק שרת אימת את עצמו ללקוחות.

בחלק הזה, נתאר כיצד להוסיף את החלק האחר של האימות - אימות בצד הלקוח. בדרך זו, רק לקוחות עם אישורים תקפים החתומים על ידי הרשות שהשרת שלנו סומך עליהם יכולים לגשת לאתר המאובטח שלנו.

אך לפני שנמשיך, בואו נראה מה היתרונות והחסרונות של שימוש באימות SSL הדדי.

יתרונות:

  • המפתח הפרטי של X.509 אישור לקוח חזק יותר מכל סיסמה שהוגדרה על ידי המשתמש. אבל זה חייב להישמר בסוד!
  • עם תעודה, ה- זהות הלקוח ידועה וקלה לאימות.
  • אין עוד סיסמאות שנשכחו!

חסרונות:

  • עלינו ליצור אישור לכל לקוח חדש.
  • יש להתקין את אישור הלקוח ביישום לקוח. למעשה: אימות לקוח X.509 תלוי בהתקן, מה שלא מאפשר להשתמש באימות מסוג זה בשטחים ציבוריים, למשל בבית קפה אינטרנט.
  • חייב להיות מנגנון לביטול אישורי לקוח שנפגעו.
  • עלינו לשמור על אישורי הלקוחות. זה יכול בקלות להיות יקר.

5.1. Truststore

חנות אמון בדרך כלשהי היא ההפך ממחסן מפתחות. הוא מחזיק בתעודות של הגופים החיצוניים שאנו סומכים עליהם.

במקרה שלנו, זה מספיק כדי לשמור את אישור ה- CA הבסיסי בחנות הנאמנות.

בואו נראה איך ליצור truststore.jks הקובץ וייבא את rootCA.crt באמצעות keytool:

keytool -import -trustcacerts -noprompt -alias ca -ext san = dns: localhost, ip: 127.0.0.1-file rootCA.crt -keystore truststore.jks

הערה, עלינו לספק את הסיסמה עבור החדש שנוצר trusstore.jks. הנה, שוב השתמשנו ב- שנה את זה ביטוי סיסמה.

זהו, ייבאנו אישור CA משלנו וחנות הנאמנות מוכנה לשימוש.

5.2. תצורת אבטחה באביב

כדי להמשיך, אנו משנים את שלנו X509 אימות שרת להאריך מ מתאם WebSecurityConfigurer ועקוף את אחת משיטות התצורה המסופקות. כאן אנו מגדירים את מנגנון x.509 לניתוח שם נפוץ (CN) שדה של אישור לחילוץ שמות משתמש.

עם שמות משתמש שחולצו זה, אביב הביטחון מסתכל למעלה בתנאי UserDetailsService עבור משתמשים תואמים. אז אנו מיישמים גם את ממשק השירות הזה המכיל משתמש הדגמה אחד.

עֵצָה: בסביבות ייצור, זה UserDetailsService יכול לטעון את המשתמשים שלה למשל ממקור נתונים JDBC.

עליכם לשים לב שאנו מציינים את הכיתה שלנו עם @EnableWebSecurity ו @EnableGlobalMethodSecurity עם אישור קדם / לאחר הפעלה.

עם האחרונים אנו יכולים להעלות הערות על המשאבים שלנו באמצעות @ PreAuthorize ו @PostAuthorize לבקרת גישה משובחת:

@SpringBootApplication @EnableWebSecurity @EnableGlobalMethodSecurity (prePostEnabled = true) מחלקה ציבורית X509AuthenticationServer מרחיב את WebSecurityConfigurerAdapter {... @Override מוגן בטל התצורה (HttpSecurity http) זורק חריגה $) "שירות שירות () שירות () שירות)). {להחזיר UserDetailsService חדש () {@Override UserDetails ציבורי loadUserByUsername (שם משתמש מחרוזת) {if (username.equals ("Bob")) {להחזיר משתמש חדש (username, "", AuthorityUtils .commaSeparatedStringToAuthorityList ("ROLE_USER"));} לזרוק שם משתמש חדש NotFoundException ("המשתמש לא נמצא!");}};}}

כאמור, כעת אנו יכולים להשתמש בקרת גישה מבוססת ביטוי בבקר שלנו. באופן ספציפי יותר, הערות ההרשאה שלנו מכובדות בגלל @EnableGlobalMethodSecurity ביאור שלנו @תְצוּרָה:

@Controller מחלקה ציבורית UserController {@PreAuthorize ("hasAuthority ('ROLE_USER')") @RequestMapping (value = "/ user") משתמש מחרוזת ציבורי (מודל מודל, מנהל ראשי) {...}}

סקירה של כל אפשרויות ההרשאה האפשריות ניתן למצוא ב תיעוד רשמי.

כשלב שינוי אחרון, עלינו לומר ליישום היכן שלנו חנות אמון נמצא וזה אימות לקוח SSL זה הכרחי (server.ssl.client-auth = צורך).

אז הכנסנו את הדברים הבאים שלנו application.properties:

server.ssl.trust-store = store / truststore.jks server.ssl.trust-store-password = $ {PASSWORD} server.ssl.client-auth = צורך

עכשיו, אם נפעיל את היישום ונכוון אליו את הדפדפן // localhost: 8443 / משתמש, אנו מתבשרים כי לא ניתן לאמת את עמיתו והוא מכחיש לפתוח את אתרנו.

5.3. תעודת צד לקוח

עכשיו הגיע הזמן ליצור את האישור בצד הלקוח. הצעדים שעלינו לבצע הם כמעט זהים לאישור בצד השרת שכבר יצרנו.

ראשית, עלינו ליצור בקשה לחתימת אישורים:

openssl req -new -newkey rsa: 4096 -nodes -keyout clientBob.key –out clientBob.csr

נצטרך לספק מידע שישולב בתעודה. לתרגיל זה, בואו נכניס רק את השם הנפוץ (CN) - בוב. חשוב כי אנו משתמשים בערך זה במהלך ההרשאה ורק בוב מוכר על ידי יישום הדוגמה שלנו.

לאחר מכן, עלינו לחתום על הבקשה באמצעות רשות האישורים שלנו:

openssl x509 -req -CA rootCA.crt -CAkey rootCA.key -in clientBob.csr -out clientBob.crt -days 365 -CAcreateserial

הצעד האחרון שעלינו לעשות הוא לארוז את האישור החתום ואת המפתח הפרטי לקובץ PKCS:

openssl pkcs12 -ייצוא-החוצה clientBob.p12 -שם "clientBob" -inkkey clientBob.key -in clientBob.crt

סוף כל סוף, אנו מוכנים להתקין את אישור הלקוח בדפדפן.

שוב נשתמש ב- Firefox:

  1. סוּג אודות: העדפות בשורת הכתובת
  2. לִפְתוֹחַ מתקדם -> הצג אישורים -> האישורים שלך
  3. לחץ על יְבוּא
  4. אתר את מדריכי באלדונג התיקייה ותיקיית המשנה שלה אביב-אבטחה-x509 / חנות
  5. בחר את clientBob.p12 הקובץ ולחץ בסדר
  6. הזן את הסיסמה עבור האישור שלך ולחץ בסדר

כעת, כשאנחנו מרעננים את האתר שלנו, נתבקש לבחור בתעודת הלקוח בה אנו רוצים להשתמש:

אם אנו רואים הודעת קבלת פנים כמו "שלום בוב!", כלומר הכל עובד כמצופה!

6. אימות הדדי עם XML

הוספת אימות לקוח X.509 ל- http תצורת אבטחה ב XML אפשרי גם:

 ...         ... 

כדי להגדיר את טומקט הבסיסי, עלינו לשים את חנות מפתחות ושלנו חנות אמון לתוך שלה conf תיקייה ולערוך את server.xml:

עֵצָה: עם clientAuth מכוון ל "רוצה", SSL עדיין מופעל, גם אם הלקוח אינו מספק אישור תקף. אך במקרה זה עלינו להשתמש במנגנון אימות שני, למשל, טופס כניסה, כדי לגשת למשאבים המאובטחים.

7. מסקנה

לסיכום, למדנו כיצד ליצור תעודת CA בחתימה עצמית וכיצד להשתמש בה לחתימת אישורים אחרים.

בנוסף, יצרנו גם תעודות בצד השרת וגם בצד הלקוח. לאחר מכן הצגנו כיצד לייבא אותם לחנות מפתחות ולחנות אמון בהתאם.

יתר על כן, עכשיו אתה אמור להיות מסוגל ארוז אישור יחד עם המפתח הפרטי שלו לפורמט PKCS12.

דנו גם מתי הגיוני להשתמש באימות לקוח Spring Security X.509, אז זה תלוי בך להחליט אם ליישם אותו ביישום האינטרנט שלך או לא.

ולסיום, מצא את קוד המקור למאמר זה ב- Github.


$config[zx-auto] not found$config[zx-overlay] not found