рдирдорд╕реНрдХрд╛рд░, рд╣реЗрдмреНрд░! рдореИрдВ рдЖрдкрдХреЗ рд▓рд┐рдП рдЬреИрдХрдм рдЬреЗрдирдХреЛрд╡ рдХреЗ "рдЬрд╛рд╡рд╛ рдХреАрд╕реНрдЯреЙрд░" рдХреЗ рд▓реЗрдЦ 9 рдХрд╛ рдЕрдиреБрд╡рд╛рдж рдкреНрд░рд╕реНрддреБрдд рдХрд░рддрд╛ рд╣реВрдВ, рд╢реБрд░реБрдЖрддреА рд▓реЗрдЦ рдХреЗ рд▓рд┐рдП рдЬреЛ рдЬрд╛рд╡рд╛ рдореЗрдВ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА рдХреА рдореВрд▓ рдмрд╛рддреЗрдВ рд╕реАрдЦрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред
рд╕рд╛рдордЧреНрд░реА рдХреА рддрд╛рд▓рд┐рдХрд╛:
- рдЬрд╛рд╡рд╛ рдХреНрд░рд┐рдкреНрдЯреЛрдЧреНрд░рд╛рдлреА
- рдЬрд╛рд╡рд╛ рд╕рд┐рдлрд░
- MessageDigest
- рдореИрдХ
- рд╣рд╕реНрддрд╛рдХреНрд╖рд░
- keypair
- Keygenerator
- KeyPairGenerator
- KeyStore
- keytool
- рдкреНрд░рдорд╛рдгрдкрддреНрд░
- CertificateFactory
- CertPath
рдХреБрдВрдЬреАрд╕реНрдЯреЛрд░
Java KeyStore рдПрдХ рдбреЗрдЯрд╛рдмреЗрд╕-рд╕реНрдЯрд╛рдЗрд▓ рдХреА рд╕реНрдЯреЛрд░ рд╣реИ, рдЬреЛ KeyStore рдХреНрд▓рд╛рд╕ ( java.security.KeyStore ) рджреНрд╡рд╛рд░рд╛ рдкреНрд░рджрд╛рди рдХреА рдЬрд╛рддреА рд╣реИред рд╕реНрдЯреЛрд░реЗрдЬ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ рдФрд░ рдлрд┐рд░ рд╕реЗ рдкрдврд╝рд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдпрд╣ рдкрд╛рд╕рд╡рд░реНрдб рдкреНрд░реЛрдЯреЗрдХреНрдЯреЗрдб рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдХреА-рд╕реНрдЯреЛрд░ рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреБрдВрдЬреА рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЕрдкрдиреЗ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЬреЛ рдХрд┐ KeyStore
рдХреЛ рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕реБрд░рдХреНрд╖рд┐рдд рд░реВрдк рд╕реЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЙрдкрдпреЛрдЧреА рддрдВрддреНрд░ рдмрдирд╛рддрд╛ рд╣реИред рдПрдХ рдХреАрд╕реНрдЯреЛрд░ рдореЗрдВ рдирд┐рдореНрди рдкреНрд░рдХрд╛рд░ рдХреА рдХреБрдВрдЬрд┐рдпрд╛рдБ рд╣реЛ рд╕рдХрддреА рд╣реИрдВ:
- рдирд┐рдЬреА рдХреБрдВрдЬреА
- рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ (рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА + рдкреНрд░рдорд╛рдгрдкрддреНрд░)
- рдЧреБрдкреНрдд рдХреБрдВрдЬреА
рдирд┐рдЬреА рдФрд░ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рдЕрд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдореЗрдВ рдПрдХ рд╕рдВрдмрджреНрдз рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╣реЛ рд╕рдХрддрд╛ рд╣реИред рдПрдХ рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдПрдХ рд╡реНрдпрдХреНрддрд┐, рд╕рдВрдЧрдарди, рдпрд╛ рдбрд┐рд╡рд╛рдЗрд╕ рдХреА рдкрд╣рдЪрд╛рди рд╕рд╛рдмрд┐рдд рдХрд░рдиреЗ рд╡рд╛рд▓рд╛ рдПрдХ рджрд╕реНрддрд╛рд╡реЗрдЬ рд╣реИ рдЬреЛ рдПрдХ рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдХреБрдВрдЬреА рдХрд╛ рдорд╛рд▓рд┐рдХ рд╣реИред рдкреНрд░рдорд╛рдг рдкрддреНрд░ рдХреЛ рдЖрдорддреМрд░ рдкрд░ рдкреНрд░рдорд╛рдг рдХреЗ рд░реВрдк рдореЗрдВ рднрд░реЛрд╕рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реА рдкрд╛рд░реНрдЯреА рджреНрд╡рд╛рд░рд╛ рдбрд┐рдЬрд┐рдЯрд▓ рд╣рд╕реНрддрд╛рдХреНрд╖рд░рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдирд┐рдЬреА рдХреБрдВрдЬреА рдХрд╛ рдЙрдкрдпреЛрдЧ рд╕рдордорд┐рдд рдПрдиреНрдХреНрд░рд┐рдкреНрд╢рди рдореЗрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдЬреНрдпрд╛рджрд╛рддрд░ рдорд╛рдорд▓реЛрдВ рдореЗрдВ, рдПрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдХрдиреЗрдХреНрд╢рди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рддреЗ рд╕рдордп, рд╕рдордорд┐рдд рдХреБрдВрдЬреА рдЕрд╕рдордорд┐рдд рд╡рд╛рд▓реЗ рд╕реЗ рдиреАрдЪ рд╣реЛрддреА рд╣реИрдВ, рдЗрд╕рд▓рд┐рдП рд╕рдмрд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЖрдк рд╕рд╛рд░реНрд╡рдЬрдирд┐рдХ рдФрд░ рдирд┐рдЬреА рдХреБрдВрдЬреА рдХреЛ рдХреАрд╕реНрдЯреЛрд░ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд░реЗрдВрдЧреЗред
рдПрдХ рдХрд╕реНрддреВрд░реА рдмрдирд╛рдирд╛
рдЖрдк рдЗрд╕рдХреА getInstance()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ KeyStore
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдПрдХ рд╡рд░реНрдЧ рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
KeyStore keyStore = KeyStore.getInstance(KeyStore.getDefaultType());
рдпрд╣ рдЙрджрд╛рд╣рд░рдг рдПрдХ рдбрд┐рдлрд╝реЙрд▓реНрдЯ KeyStore
рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рддрд╛ рд╣реИред рдЖрдк getInstance()
рд╡рд┐рдзрд┐ рдХреЗ рд▓рд┐рдП рдПрдХ рдкреИрд░рд╛рдореАрдЯрд░ рдкрд╛рд╕ рдХрд░рдХреЗ рдПрдХ рдЕрд▓рдЧ рдХреБрдВрдЬреА рд╕рдВрдЧреНрд░рд╣рдг рдкреНрд░рд╛рд░реВрдк рдХреЗ рд╕рд╛рде KeyStore рдЗрдВрд╕реНрдЯреЗрдВрд╕ рднреА рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, PKCS12
рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдмрдирд╛рдирд╛:
KeyStore keyStore = KeyStore.getInstance("PKCS12");
рдбрд╛рдЙрдирд▓реЛрдб рдХреАрд╕реНрдЯреЙрд░
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рдХрд┐ рдЖрдк рдПрдХ рдХреАрд╕реНрдЯреЛрд░ рдХреА рдЖрд╡реГрддреНрддрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХреЗрдВ, рдЖрдкрдХреЛ рдЗрд╕реЗ рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред KeyStore
рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдЕрдХреНрд╕рд░ рдбрд┐рд╕реНрдХ рдпрд╛ рдЕрдиреНрдп рднрдВрдбрд╛рд░рдг рдХреЗ рд▓рд┐рдП рдмрд╛рдж рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХреЗ рд▓рд┐рдП рд▓рд┐рдЦреЗ KeyStore
рд╣реИрдВ, рдХреНрдпреЛрдВрдХрд┐ KeyStore
рд╡рд░реНрдЧ рдорд╛рдирддрд╛ рд╣реИ рдХрд┐ рдЖрдкрдХреЛ рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рд╕реЗ рдкрд╣рд▓реЗ рдЗрд╕рдХрд╛ рдбреЗрдЯрд╛ рдЕрд╡рд╢реНрдп рдкрдврд╝рдирд╛ рдЪрд╛рд╣рд┐рдПред рд╣рд╛рд▓рд╛рдБрдХрд┐, рдЖрдк рдбреЗрдЯрд╛ рдХреЗ рдмрд┐рдирд╛ рдПрдХ рд░рд┐рдХреНрдд KeyStore
рдЙрджрд╛рд╣рд░рдг рдХреЛ рдЗрдирд┐рд╢рд┐рдпрд▓рд╛рдЗрдЬрд╝ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рдмрд╛рдж рдореЗрдВ рджреЗрдЦреЗрдВрдЧреЗред
load()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдбреЗрдЯрд╛ рдХреЛ рдлрд╝рд╛рдЗрд▓ рдпрд╛ рдЕрдиреНрдп рд╕реНрдЯреЛрд░реЗрдЬ рд╕реЗ load()
рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдореЗрдВ рджреЛ рдкреИрд░рд╛рдореАрдЯрд░ рд╣реЛрддреЗ рд╣реИрдВ:
InputStream
рдЬрд┐рд╕рдореЗрдВ рд╕реЗ рдбреЗрдЯрд╛ рд▓реЛрдб рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛редchar[]
рдХреАрд╕реНрдЯреНрд░реЛрд░ рд╕реЗ рдкрд╛рд╕рд╡рд░реНрдб рдпреБрдХреНрдд рд╡рд░реНрдгреЛрдВ рдХреА рдПрдХ рд╕рд░рдгреАред
рдпрд╣рд╛рдБ рдПрдХ рдХрд╕реНрддреВрд░реА рд▓реЛрдб рдХрд░рдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣реИ:
char[] keyStorePassword = "123abc".toCharArray(); try(InputStream keyStoreData = new FileInputStream("keystore.ks")){ keyStore.load(keyStoreData, keyStorePassword); }
рдпрд╣ рдЙрджрд╛рд╣рд░рдг keystore.ks keystore рдлрд╝рд╛рдЗрд▓ рдХреЛ рд▓реЛрдб рдХрд░рддрд╛ рд╣реИред рдпрджрд┐ рдЖрдк рдХрд┐рд╕реА рднреА рдбреЗрдЯрд╛ рдХреЛ рдХреАрд╕реНрдЯреЛрд░ рдореЗрдВ рд▓реЛрдб рдирд╣реАрдВ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ InputStream
рдкреИрд░рд╛рдореАрдЯрд░ рдХреЗ рд▓рд┐рдП рдХреЗрд╡рд▓ null
рдкрд╛рд╕ рдХрд░реЗрдВред рдпрд╣ рдХреИрд╕реЗ рдПрдХ рдЦрд╛рд▓реА рдХреАрд╕реНрдЯреЛрд░ рд▓реЛрдб рд╣реЛ рд░рд╣рд╛ рд╣реИ рдЬреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
keyStore3.load(null, keyStorePassword);
KeyStore
рдХреНрд▓рд╛рд╕ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рд╣рдореЗрд╢рд╛ рдбреЗрдЯрд╛ рдпрд╛ null
рд╕рд╛рде рд▓реЛрдб KeyStore
ред рдЕрдиреНрдпрдерд╛, рдХреАрд╕реНрдЯреЛрд░ рдХреЛ рдЖрд░рдВрднреАрдХреГрдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рддрд░реАрдХреЛрдВ рдкрд░ рд╕рднреА рдХреЙрд▓ рдЕрдкрд╡рд╛рджреЛрдВ рдХреЛ рдлреЗрдВрдХ рджреЗрдВрдЧреЗред
рдЪрд╛рдмреА рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛
рдЖрдк getEntry()
рд╡рд░реНрдЧ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреА рдЪрд╛рдмрд┐рдпрд╛рдБ рдЗрд╕рдХреЗ getEntry()
рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдХреАрд╕реНрдЯреЛрд░ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдПрдХ рдЙрдкрдирд╛рдо рдХреЗ рд▓рд┐рдП рдореИрдк рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреЛ рдХреБрдВрдЬреА рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рд╕реЗ рд╕реБрд░рдХреНрд╖рд┐рдд рд╣реЛрддрд╛ рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рдХреБрдВрдЬреА рдХреЛ рдПрдХреНрд╕реЗрд╕ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдХреБрдВрдЬреА рдЙрдкрдирд╛рдо рдФрд░ рдкрд╛рд╕рд╡рд░реНрдб рдХреЛ getEntry()
рд╡рд┐рдзрд┐ рд╕реЗ рдкрд╛рд╕ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ред рдпрд╣рд╛рдБ KeyStore
рдЙрджрд╛рд╣рд░рдг рдкрд░ рд▓рд┐рдЦрдиреЗ рдХреА рдкрд╣реБрдБрдЪ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рджрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ:
char[] keyPassword = "789xyz".toCharArray(); KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword); KeyStore.Entry keyEntry = keyStore3.getEntry("keyAlias", entryPassword);
рдпрджрд┐ рдЖрдк рдЬрд╛рдирддреЗ рд╣реИрдВ рдХрд┐ рдЬрд┐рд╕ рд░рд┐рдХреЙрд░реНрдб рдХреЛ рдЖрдк рдПрдХреНрд╕реЗрд╕ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рд╡рд╣ рдирд┐рдЬреА рдХреБрдВрдЬреА рд╣реИ, рддреЛ рдЖрдк KeyStore.Entry
рд╕реЗ KeyStore.PrivateKeyEntry
рдХрд╛ рдЙрджрд╛рд╣рд░рдг рдкрд░рд┐рд╡рд░реНрддрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрд╣рд╛рдБ рдпрд╣ рдХреИрд╕рд╛ рджрд┐рдЦрддрд╛ рд╣реИ:
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry) keyStore3.getEntry("keyAlias", entryPassword);
KeyStore.PrivateKeyEntry
рдХрд╛рд╕реНрдЯрд┐рдВрдЧ рдХрд░рдиреЗ рдХреЗ рдмрд╛рдж KeyStore.PrivateKeyEntry
рдЖрдк рдирд┐рдореНрди рд╡рд┐рдзрд┐рдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдирд┐рдЬреА рдХреБрдВрдЬреА, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдФрд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╢реНрд░реГрдВрдЦрд▓рд╛ рддрдХ рдкрд╣реБрдБрдЪ рд╕рдХрддреЗ рд╣реИрдВ:
getPrivateKey()
getCertificate()
getCertificateChain()
рдХреБрдВрдЬреА рднрдВрдбрд╛рд░рдг
рдЖрдк KeyStore
рдХреНрд▓рд╛рд╕ рдХреЗ рдЗрдВрд╕реНрдЯреЗрдВрд╕ рдореЗрдВ рдХреАрдЬрд╝ рд▓рдЧрд╛ рд╕рдХрддреЗ рд╣реИрдВред KeyStore рдХреЗ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ рдПрдХ рдЧреБрдкреНрдд рдХреБрдВрдЬреА (рд╕рдордорд┐рдд рдХреБрдВрдЬреА) рд░рдЦрдиреЗ рдХрд╛ рдПрдХ рдЙрджрд╛рд╣рд░рдг:
SecretKey secretKey = getSecretKey(); KeyStore.SecretKeyEntry secretKeyEntry = new KeyStore.SecretKeyEntry(secretKey); keyStore3.setEntry("keyAlias2", secretKeyEntry, entryPassword);
рднрдВрдбрд╛рд░рдг
рдХрднреА-рдХрднреА рдЖрдк рдХрд┐рд╕реА рдкреНрд░рдХрд╛рд░ рдХреЗ рднрдВрдбрд╛рд░рдг (рдбрд┐рд╕реНрдХ, рдбреЗрдЯрд╛рдмреЗрд╕, рдЖрджрд┐) рдХреЛ рдХреАрд╕реНрдЯреЛрд░ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣ рд╕рдХрддреЗ рд╣реИрдВ рддрд╛рдХрд┐ рдЖрдк рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ рджреВрд╕рд░реА рдмрд╛рд░ рд▓реЛрдб рдХрд░ рд╕рдХреЗрдВред KeyStore
рд╡рд░реНрдЧ KeyStore
рдПрдХ рдЙрджрд╛рд╣рд░рдг store()
рд╡рд┐рдзрд┐ рдХреЛ рдХреЙрд▓ рдХрд░рдХреЗ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред рдПрдХ рдЙрджрд╛рд╣рд░рдг:
char[] keyStorePassword = "123abc".toCharArray(); try (FileOutputStream keyStoreOutputStream = new FileOutputStream("data/keystore.ks")) { keyStore3.store(keyStoreOutputStream, keyStorePassword); }