рд▓реЗрдЦ рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА рдЙрдкрдпреБрдХреНрдд рдард░реЗрд▓ рдЬреЗ:
- рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╛рдп рдЖрд╣реЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдЖрдгрд┐ рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реАрд╡рд░ рд╡реЗрдмрд╕реЙрдХреЗрдЯреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХрд╛ рдЖрд╣реЗ рд╣реЗ рд╕рдордЬрддреЗ;
- рдореА рд▓реЛрдХрд╛рдВрдЪреНрдпрд╛ рдорд░реНрдпрд╛рджрд┐рдд рд╡рд░реНрддреБрд│рд╛рд╕рд╛рдареА рдХрд┐рдВрд╡рд╛ рдлрдХреНрдд рдорд╛рдЭреНрдпрд╛рд╕рд╛рдареА рд╡реЗрдм рд╕реЗрд╡рд╛ рдкреНрд░рдХрд╛рд╢рд┐рдд рдХрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ;
- рдЕрд╕реЗ рд╡рд╛рдЯрддреЗ рдХреА рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЖрдзреАрдЪ рдХреЛрдгреАрддрд░реА рдХреЗрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдЬрдЧрд╛рд▓рд╛ рдереЛрдбреЗ рдЕрдзрд┐рдХ рд╕реЛрдпреАрд╕реНрдХрд░ рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╡реВ рдЗрдЪреНрдЫрд┐рддреЛ.
рд╡реЗрдмрд╕реЙрдХреЗрдЯрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд╕реБрдорд╛рд░реЗ 8 рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА рд╕реБрд░реВ рдЭрд╛рд▓рд╛. рдкреВрд░реНрд╡реА, рдкрджреНрдзрддреА рд▓рд╛рдВрдм HTTP рд╡рд┐рдирдВрддреНрдпрд╛ (рдкреНрд░рддреНрдпрдХреНрд╖рд╛рдд рдкреНрд░рддрд┐рд╕рд╛рдж) рд╕реНрд╡рд░реВрдкрд╛рдд рд╡рд╛рдкрд░рд▓реНрдпрд╛ рдЬрд╛рдд рд╣реЛрддреНрдпрд╛: рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рдиреЗ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рд╡рд┐рдирдВрддреА рдкрд╛рдард╡рд▓реА рдЖрдгрд┐ рдХрд╛рд╣реАрддрд░реА рдЙрддреНрддрд░ рджреЗрдгреНрдпрд╛рдЪреА рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗрд▓реА, рдкреНрд░рддрд┐рд╕рд╛рджрд╛рдирдВрддрд░ рддреЗ рдкреБрдиреНрд╣рд╛ рдХрдиреЗрдХреНрдЯ рдЭрд╛рд▓реЗ рдЖрдгрд┐ рдкреНрд░рддреАрдХреНрд╖рд╛ рдХреЗрд▓реА. рдкрдг рдирдВрддрд░ рд╡реЗрдмрд╕реЙрдХреЗрдЯреНрд╕ рджрд┐рд╕реВ рд▓рд╛рдЧрд▓реНрдпрд╛.
рдХрд╛рд╣реА рд╡рд░реНрд╖рд╛рдВрдкреВрд░реНрд╡реА, рдЖрдореНрд╣реА рд╢реБрджреНрдз PHP рдордзреНрдпреЗ рдЖрдордЪреА рд╕реНрд╡рддрдГрдЪреА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╡рд┐рдХрд╕рд┐рдд рдХреЗрд▓реА рдЖрд╣реЗ, рдЬреА https рд╡рд┐рдирдВрддреНрдпрд╛ рд╡рд╛рдкрд░реВ рд╢рдХрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рд╣рд╛ рджреБрд╡рд╛ рд╕реНрддрд░ рдЖрд╣реЗ. рдХрд╛рд╣реА рдХрд╛рд│рд╛рдкреВрд░реНрд╡реА, рдЬрд╡рд│рдкрд╛рд╕ рд╕рд░реНрд╡ рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░рдиреЗ https рдЖрдгрд┐ рд╕рдкреЛрд░реНрдЯ рдХрдиреЗрдХреНрд╢рди:рдЕрдкрдЧреНрд░реЗрдбрд╡рд░ рдкреНрд░реЙрдХреНрд╕реА рд╡рд┐рдирдВрддреНрдпрд╛ рд╢рд┐рдХрд▓реНрдпрд╛ рдЖрд╣реЗрдд.
рдЬреЗрд╡реНрд╣рд╛ рд╣реЗ рдШрдбрд▓реЗ рддреЗрд╡реНрд╣рд╛, SPA рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА рд╡реЗрдмрд╕реЙрдХреЗрдЯреНрд╕ рдЬрд╡рд│рдЬрд╡рд│ рдбреАрдлреЙрд▓реНрдЯ рд╕реЗрд╡рд╛ рдмрдирд▓реА, рдХрд╛рд░рдг рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдкреБрдврд╛рдХрд╛рд░рд╛рдиреЗ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рд╕ рд╕рд╛рдордЧреНрд░реА рдкреНрд░рджрд╛рди рдХрд░рдгреЗ рдХрд┐рддреА рд╕реЛрдпреАрдЪреЗ рдЖрд╣реЗ (рджреБрд╕рд░реНрдпрд╛ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдХрдбреВрди рд╕рдВрджреЗрд╢ рдкреНрд░рд╕рд╛рд░рд┐рдд рдХрд░рд╛ рдХрд┐рдВрд╡рд╛ рдкреНрд░рддрд┐рдорд╛, рджрд╕реНрддрдРрд╡рдЬ, рд╕рд╛рджрд░реАрдХрд░рдгрд╛рдЪреА рдирд╡реАрди рдЖрд╡реГрддреНрддреА рдбрд╛рдЙрдирд▓реЛрдб рдХрд░рд╛. рдХреА рд╕рдзреНрдпрд╛ рдХреЛрдгреАрддрд░реА рд╕рдВрдкрд╛рджрд┐рдд рдХрд░рдд рдЖрд╣реЗ).
рдЬрд░реА рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрд░реНрдпрд╛рдЪ рдХрд╛рд│рд╛рдкрд╛рд╕реВрди рдЖрд╣реЗ, рддрд░реАрд╣реА рддреЗ рдЕрд╕рдорд╛рдзрд╛рдирдХрд╛рд░рдХрдкрдгреЗ рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗ, рдХрд╛рд░рдг рддреЗ рдмрд╛рдпрдкрд╛рд╕ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░рддрд╛рдирд╛ рдЕрдиреЗрдХ рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛рдд. рдЖрдгрд┐ (рд╢рдХреНрдпрддреЛ :slightly_smiling_face: ) рдореНрд╣рдгреВрдирдЪ IOS рдмреНрд░рд╛рдЙрдЭрд░ (рд╕рдлрд╛рд░реА рд╕реЛрдбреВрди) рддреЗ рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реАрдд рдЖрдгрд┐ рд╕реНрдерд╛рдирд┐рдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдЯреЛрдЕрд░рдХрдбреВрди рд╡рд┐рдирдВрддреА рдХрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реАрдд. рд▓реЙрдЧрд┐рди/рдкрд╛рд╕ рдХрд┐рдВрд╡рд╛ ssh рдХреА рдХрд┐рдВрд╡рд╛ рдлрд╛рдпрд░рд╡реЙрд▓рджреНрд╡рд╛рд░реЗ рдЖрд╡рд╢реНрдпрдХ рдкреЛрд░реНрдЯ рдмрдВрдж рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рддреБрд▓рдиреЗрдд рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдВрдЪреЗ рдмрд░реЗрдЪ рдлрд╛рдпрджреЗ рдЖрд╣реЗрдд. рдкрдг рд╣реЗ рддреНрдпрд╛рдмрджреНрджрд▓ рдирд╛рд╣реА.
iOS рд╡рд░, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреНрдпрд╛рдЪреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдЕрдЧрджреА рд╕реЛрдкреА рдЖрд╣реЗ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рдЧреЛрд╖реНрдЯреАрдВрд╢рд┐рд╡рд╛рдп рдирд╛рд╣реА), рдкрд░рдВрддреБ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рддреЗ рд╕реВрдЪрдирд╛рдВрдиреБрд╕рд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рддреЗ, рдЬреНрдпрд╛рдкреИрдХреА рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдмрд░реЗрдЪ рдХрд╛рд╣реА рдЖрд╣реЗрдд рдЖрдгрд┐ рдЬреЗ рдлрдХреНрдд рд╕рдлрд╛рд░реА рдмреНрд░рд╛рдЙрдЭрд░рд╕рд╛рдареА рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗрдд. рджреБрд░реНрджреИрд╡рд╛рдиреЗ, рд╡реЗрдм рд╕реЙрдХреЗрдЯрд╕рд╛рдареА рдХреНрд▓рд╛рдпрдВрдЯ ╨бert рдХрд╕реЗ рд╡рд╛рдкрд░рд╛рд╡реЗ рд╣реЗ рд╕рдлрд╛рд░реАрд▓рд╛ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЕрд╕реЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╕реЗ рддрдпрд╛рд░ рдХрд░рд╛рд╡реЗ рдпрд╛рдмрджреНрджрд▓ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рдЕрдиреЗрдХ рд╕реВрдЪрдирд╛ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рд╡реНрдпрд╡рд╣рд╛рд░рд╛рдд рд╣реЗ рдЕрдкреНрд░рд╛рдкреНрдп рдЖрд╣реЗ.
рд╡реЗрдмрд╕реЙрдХреЗрдЯ рд╕рдордЬреВрди рдШреЗрдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдЦрд╛рд▓реАрд▓ рдпреЛрдЬрдирд╛ рд╡рд╛рдкрд░рд▓реА: рд╕рдорд╕реНрдпрд╛/ рдЧреГрд╣реАрддрдХ/ рдЙрдкрд╛рдп.
рд╕рдорд╕реНрдпрд╛: IOS рдЖрдгрд┐ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рд╕рдкреЛрд░реНрдЯ рд╕рдХреНрд╖рдо рдХреЗрд▓реЗрд▓реНрдпрд╛ рдЗрддрд░ рдНрдкреНрд▓рд┐рдХреЗрд╢рдиреНрд╕рд╕рд╛рдареА Safari рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЭрд░рд╡рд░реАрд▓ рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рджреНрд╡рд╛рд░реЗ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХреЗрд▓реЗрд▓реНрдпрд╛ рд╕рдВрд╕рд╛рдзрдирд╛рдВрд╕рд╛рдареА рд╡рд┐рдирдВрддреА рдкреНрд░реЙрдХреНрд╕реА рдХрд░рддрд╛рдирд╛ рд╡реЗрдм рд╕реЙрдХреЗрдЯрд╕рд╛рдареА рдХреЛрдгрддреЗрд╣реА рд╕рдорд░реНрдерди рдирд╛рд╣реА.
рдЧреГрд╣реАрддрдХреЗ:
- рдЕрдВрддрд░реНрдЧрдд/рдмрд╛рд╣реНрдп рдкреНрд░реЙрдХреНрд╕реА рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪреНрдпрд╛ рд╡реЗрдмрд╕реЙрдХреЗрдЯреНрд╕рд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░реЗ (рдХреЛрдгрддреЗрд╣реА рдирд╕реЗрд▓ рд╣реЗ рдЬрд╛рдгреВрди) рд╡рд╛рдкрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЕрд╕рд╛ рдЕрдкрд╡рд╛рдж рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ.
- рд╡реЗрдмрд╕реЙрдХреЗрдЯрд╕рд╛рдареА, рддреБрдореНрд╣реА рд╕рд╛рдорд╛рдиреНрдп (рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдирд╕рд▓реЗрд▓реНрдпрд╛) рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд┐рдирдВрддреАрджрд░рдореНрдпрд╛рди рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рд╕рддреНрд░рд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдПрдХ рдЕрдирдиреНрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрдгрд┐ рдмрдЪрд╛рд╡ рдХрд░рдгреНрдпрд╛рдпреЛрдЧреНрдп рдХрдиреЗрдХреНрд╢рди рдмрдирд╡реВ рд╢рдХрддрд╛.
- рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ рд╡рд╛рдкрд░реВрди рддрд╛рддреНрдкреБрд░рддреА рд╕рддреНрд░реЗ рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд (рдХреЗрд╡рд│ рдЕрдВрдЧрднреВрдд рдореЙрдбреНрдпреВрд▓ рдЖрдгрд┐ рдХрд╛рд░реНрдпреЗ).
- рддрд╛рддреНрдкреБрд░рддреЗ рд╕рддреНрд░ рдЯреЛрдХрди рдЖрдзреАрдЪ рддрдпрд╛рд░-рддрдпрд╛рд░ Apache рдореЙрдбреНрдпреВрд▓ рдореНрд╣рдгреВрди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд.
- рддрд╛рддреНрдкреБрд░рддреЗ рд╕рддреНрд░ рдЯреЛрдХрди рддрд╛рд░реНрдХрд┐рдХрд░рд┐рддреНрдпрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рдж рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХрд░реВрди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдирдВрддрд░ рджреГрд╢реНрдпрдорд╛рди рд╕реНрдерд┐рддреА.
рдХрд╛рдорд╛рдЪреЗ рдзреНрдпреЗрдп: рд╕реЗрд╡рд╛ рдЖрдгрд┐ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди IOS рд╡рд░реАрд▓ рдореЛрдмрд╛рдЗрд▓ рдлреЛрдирд╡рд░реВрди рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд╢рд┐рд╡рд╛рдп (рдЬрд╕реЗ рдХреА VPN), рдПрдХреАрдХреГрдд рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд╛рд╡реЗ.
рдЕрддрд┐рд░рд┐рдХреНрдд рдзреНрдпреЗрдп: рдореЛрдмрд╛рдИрд▓ рдЗрдВрдЯрд░рдиреЗрдЯрд╡рд░ рд╕рд╛рдордЧреНрд░реАрдЪреНрдпрд╛ рдЬрд▓рдж рд╡рд┐рддрд░рдгрд╛рд╕рд╣ рд╡реЗрд│ рдЖрдгрд┐ рд╕рдВрд╕рд╛рдзрдиреЗ/рдлреЛрди рд░рд╣рджрд╛рд░реА (рд╡реЗрдм тАЛтАЛрд╕реЙрдХреЗрдЯрд╢рд┐рд╡рд╛рдп рдХрд╛рд╣реА рд╕реЗрд╡рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рд╡рд┐рдирдВрддреНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддрд╛рдд) рд╡рд╛рдЪрд╡рддрд╛рдд.
рдХрд╕реЗ рддрдкрд╛рд╕рд╛рдпрдЪреЗ?
1. рдкреГрд╖реНрдареЗ рдЙрдШрдбрдгреЗ:
тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://teamcity.yourdomain.com ╨▓ ╨╝╨╛╨▒╨╕╨╗╤М╨╜╨╛╨╝ ╨▒╤А╨░╤Г╨╖╨╡╤А╨╡ Safari (╨┤╨╛╤Б╤В╤Г╨┐╨╡╨╜ ╤В╨░╨║╨╢╨╡ ╨▓ ╨┤╨╡╤Б╨║╤В╨╛╨┐╨╜╨╛╨╣ ╨▓╨╡╤А╤Б╨╕╨╕) тАФ ╨▓╤Л╨╖╤Л╨▓╨░╨╡╤В ╤Г╤Б╨┐╨╡╤И╨╜╨╛╨╡ ╨┐╨╛╨┤╨║╨╗╤О╤З╨╡╨╜╨╕╨╡ ╨║ ╨▓╨╡╨▒-╤Б╨╛╨║╨╡╤В╨░╨╝.
тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://teamcity.yourdomain.com/admin/admin.html?item=diagnostics&tab=webSтАжтАФ ╨┐╨╛╨║╨░╨╖╤Л╨▓╨░╨╡╤В ping/pong.
тАФ ╨╜╨░╨┐╤А╨╕╨╝╨╡╤А, https://rancher.yourdomain.com/p/c-84bnv:p-vkszd/workload/deployment:danidb:phтАж-> viewlogs тАФ ╨┐╨╛╨║╨░╨╖╤Л╨▓╨░╨╡╤В ╨╗╨╛╨│╨╕ ╨║╨╛╨╜╤В╨╡╨╣╨╜╨╡╤А╨░.
2. рдХрд┐рдВрд╡рд╛ рд╡рд┐рдХрд╕рдХ рдХрдиреНрд╕реЛрд▓рдордзреНрдпреЗ:
рдЧреГрд╣реАрддрдХ рдЪрд╛рдЪрдгреА:
1. рдЕрдВрддрд░реНрдЧрдд/рдмрд╛рд╣реНрдп рдкреНрд░реЙрдХреНрд╕реА рд╕рдВрд╕рд╛рдзрдирд╛рдВрдЪреНрдпрд╛ рд╡реЗрдм рд╕реЙрдХреЗрдЯрд╕рд╛рдареА рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдВрдЪреНрдпрд╛ рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА (рдХрд╛рд╣реАрд╣реА рдирд╕реЗрд▓ рд╣реЗ рдЬрд╛рдгреВрди) рдЕрд╕рд╛ рдЕрдкрд╡рд╛рдж рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ.
рдпреЗрдереЗ 2 рдЙрдкрд╛рдп рд╕рд╛рдкрдбрд▓реЗ:
рдЕ) рд╕реНрддрд░рд╛рд╡рд░
<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>
рдкреНрд░рд╡реЗрд╢ рдкрд╛рддрд│реА рдмрджрд▓рд╛.
рдпрд╛ рдкрджреНрдзрддреАрдордзреНрдпреЗ рдЦрд╛рд▓реАрд▓ рдмрд╛рд░рдХрд╛рд╡реЗ рдЖрд╣реЗрдд:
- рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдкрдбрддрд╛рд│рдгреА рдкреНрд░реЙрдХреНрд╕реА рд░рд┐рд╕реЛрд░реНрд╕рд▓рд╛ рд╡рд┐рдирдВрддреА рдХреЗрд▓реНрдпрд╛рдирдВрддрд░ рд╣реЛрддреЗ, рдореНрд╣рдгрдЬреЗрдЪ рдкреЛрд╕реНрдЯ рд░рд┐рдХреНрд╡реЗрд╕реНрдЯ рд╣рдБрдбрд╢реЗрдХ. рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЕрд╕рд╛ рдХреА рдкреНрд░реЙрдХреНрд╕реА рдкреНрд░рдердо рд▓реЛрдб рд╣реЛрдИрд▓ рдЖрдгрд┐ рдирдВрддрд░ рд╕рдВрд░рдХреНрд╖рд┐рдд рд╕реЗрд╡реЗрдЪреА рд╡рд┐рдирдВрддреА рдХрд╛рдкрд▓реА рдЬрд╛рдИрд▓. рд╣реЗ рд╡рд╛рдИрдЯ рдЖрд╣реЗ, рдкрд░рдВрддреБ рдЧрдВрднреАрд░ рдирд╛рд╣реА;
- http2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓рдордзреНрдпреЗ. рд╣реЗ рдЕрджреНрдпрд╛рдк рдорд╕реБрджреНрдпрд╛рдд рдЖрд╣реЗ, рдЖрдгрд┐ рдмреНрд░рд╛рдЙрдЭрд░ рдЙрддреНрдкрд╛рджрдХрд╛рдВрдирд╛ рддреЗ рдХрд╕реЗ рдЕрдВрдорд▓рд╛рдд рдЖрдгрд╛рдпрдЪреЗ рд╣реЗ рдорд╛рд╣рд┐рдд рдирд╛рд╣реА #info about tls1.3 http2 рдкреЛрд╕реНрдЯ рд╣рдБрдбрд╢реЗрдХ (рдЖрддрд╛ рдХрд╛рдо рдХрд░рдд рдирд╛рд╣реА)
RFC 8740 "HTTP/1.3 рд╕рд╣ TLS 2 рд╡рд╛рдкрд░рдгреЗ" рд▓рд╛рдЧреВ рдХрд░рд╛ ; - рд╣реА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд╢реА рдПрдХрддреНрд░ рдХрд░рд╛рдпрдЪреА рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдирд╛рд╣реА.
b) рдореВрд▓рднреВрдд рд╕реНрддрд░рд╛рд╡рд░, рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рд╢рд┐рд╡рд╛рдп ssl рд▓рд╛ рдЕрдиреБрдорддреА рджреНрдпрд╛.
SSLVerifyClient рдЖрд╡рд╢реНрдпрдХ => SSLVerifyClient рдкрд░реНрдпрд╛рдпреА, рдкрд░рдВрддреБ рдпрд╛рдореБрд│реЗ рдкреНрд░реЙрдХреНрд╕реА рд╕рд░реНрд╡реНрд╣рд░рдЪреА рд╕реБрд░рдХреНрд╖рд╛ рдкрд╛рддрд│реА рдХрдореА рд╣реЛрддреЗ, рдХрд╛рд░рдг рдЕрд╢рд╛ рдХрдиреЗрдХреНрд╢рдирд╡рд░ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рд╢рд┐рд╡рд╛рдп рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗрд▓реА рдЬрд╛рдИрд▓. рддрдерд╛рдкрд┐, рддреБрдореНрд╣реА рдкреБрдвреАрд▓ рдирд┐рд░реНрджреЗрд╢рд╛рдВрд╕рд╣ рдкреНрд░реЙрдХреНрд╕реА рд╕реЗрд╡рд╛рдВрдордзреНрдпреЗ рдкреНрд░рд╡реЗрд╢ рдирд╛рдХрд╛рд░реВ рд╢рдХрддрд╛:
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteRule .? - [F]
ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"
рдПрд╕рдПрд╕рдПрд▓ рдмрджреНрджрд▓ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдорд╛рд╣рд┐рддреА рд▓реЗрдЦрд╛рдд рдЖрдврд│реВ рд╢рдХрддреЗ:
рджреЛрдиреНрд╣реА рдкрд░реНрдпрд╛рдпрд╛рдВрдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рдд рдЖрд▓реА, рдкрд░реНрдпрд╛рдп "b" рддреНрдпрд╛рдЪреНрдпрд╛ рдмрд╣реБрдореБрдЦреАрдкрдгрд╛рд╕рд╛рдареА рдЖрдгрд┐ http2 рдкреНрд░реЛрдЯреЛрдХреЙрд▓рд╢реА рд╕реБрд╕рдВрдЧрддрддреЗрд╕рд╛рдареА рдирд┐рд╡рдбрд▓рд╛ рдЧреЗрд▓рд╛.
рдпрд╛ рдЧреГрд╣рд┐рддрдХрд╛рдЪреА рдкрдбрддрд╛рд│рдгреА рдкреВрд░реНрдг рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирд╕рд╣ рдмрд░реЗрдЪ рдкреНрд░рдпреЛрдЧ рдХрд░рд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ; рдЦрд╛рд▓реАрд▓ рдбрд┐рдЭрд╛рдЗрдирдЪреА рдЪрд╛рдЪрдгреА рдШреЗрдгреНрдпрд╛рдд рдЖрд▓реА:
рдЬрд░ = рдЖрд╡рд╢реНрдпрдХ = рдкреБрдиреНрд╣рд╛ рд▓рд┐рд╣рд╛
рдЕрдкрд╛рдЪреЗ рдореБрдЦреНрдп рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ Apache HTTP рд╕рд░реНрд╡реНрд╣рд░рдордзреАрд▓ рдЕрднрд┐рд╡реНрдпрдХреНрддреА
рдкрд░рд┐рдгрд╛рдо рдЦрд╛рд▓реАрд▓ рдореВрд▓рднреВрдд рдбрд┐рдЭрд╛рдЗрди рдЖрд╣реЗ:
SSLVerifyClient optional
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"
#websocket for safari without cert auth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
...
#╨╖╨░╨╝╨╡╤Й╨░╨╡╨╝ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨▓╨╗╨░╨┤╨╡╨╗╤М╤Ж╤Г ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╨╜╨░ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨╜╨╛╨╝╨╡╤А╤Г ╨┐╤А╨╛╤В╨╛╨║╨╛╨╗╨░
SSLUserName SSl_PROTOCOL
</If>
</If>
рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рд▓рдХрд╛рдЪреА рд╡рд┐рджреНрдпрдорд╛рди рдЕрдзрд┐рдХреГрддрддрд╛ рд╡рд┐рдЪрд╛рд░рд╛рдд рдШреЗрдКрди, рдкрд░рдВрддреБ рдЧрд╣рд╛рд│ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рд╕рд╣, рдорд▓рд╛ рдЙрдкрд▓рдмреНрдз рдирд╕рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рд▓рдХрд╛рд▓рд╛ SSl_PROTOCOL (SSL_CLIENT_S_DN_CN рдРрд╡рдЬреА) рдЙрдкрд▓рдмреНрдз рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕рдЪреНрдпрд╛ рд░реВрдкрд╛рдд рдЬреЛрдбрд╛рд╡реЗ рд▓рд╛рдЧрд▓реЗ, рджрд╕реНрддрдРрд╡рдЬреАрдХрд░рдгрд╛рдд рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓:
2. рд╡реЗрдмрд╕реЙрдХреЗрдЯрд╕рд╛рдареА, рддреБрдореНрд╣реА рд╕рд╛рдорд╛рдиреНрдп (рд╡реЗрдмрд╕реЙрдХреЗрдЯ рдирд╕рд▓реЗрд▓реНрдпрд╛) рдмреНрд░рд╛рдЙрдЭрд░ рд╡рд┐рдирдВрддреАрджрд░рдореНрдпрд╛рди рд╡реНрдпреБрддреНрдкрдиреНрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рддрд╛рддреНрдкреБрд░рддреНрдпрд╛ рд╕рддреНрд░рд╛рдВрдЪрд╛ рд╡рд╛рдкрд░ рдХрд░реВрди рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рдЖрдгрд┐ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрдиреЗрдХреНрд╢рди рдмрдирд╡реВ рд╢рдХрддрд╛.
рдорд╛рдЧреАрд▓ рдЕрдиреБрднрд╡рд╛рд╡рд░ рдЖрдзрд╛рд░рд┐рдд, рдирд┐рдпрдорд┐рдд (рдиреЙрди-рд╡реЗрдм рд╕реЙрдХреЗрдЯ) рд╡рд┐рдирдВрддреА рджрд░рдореНрдпрд╛рди рд╡реЗрдм рд╕реЙрдХреЗрдЯ рдХрдиреЗрдХреНрд╢рдирд╕рд╛рдареА рддрд╛рддреНрдкреБрд░рддреЗ рдЯреЛрдХрди рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рддреБрдореНрд╣рд╛рд▓рд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдЕрддрд┐рд░рд┐рдХреНрдд рд╡рд┐рднрд╛рдЧ рдЬреЛрдбрдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ.
#╨┐╨╛╨┤╨│╨╛╤В╨╛╨▓╨║╨░ ╨┐╨╡╤А╨╡╨┤╨░╤З╨░ ╤Б╨╡╨▒╨╡ ╨бookie ╤З╨╡╤А╨╡╨╖ ╨┐╨╛╨╗╤М╨╖╨╛╨▓╨░╤В╨╡╨╗╤М╤Б╨║╨╕╨╣ ╨▒╤А╨░╤Г╨╖╨╡╤А
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
Header set Set-Cookie "websocket-allowed=true; path=/; Max-Age=100"
</If>
</If>
#╨┐╤А╨╛╨▓╨╡╤А╨║╨░ Cookie ╨┤╨╗╤П ╤Г╤Б╤В╨░╨╜╨╛╨▓╨╗╨╡╨╜╨╕╤П ╨▓╨╡╨▒-╤Б╨╛╨║╨╡╤В ╤Б╨╛╨╡╨┤╨╕╨╜╨╡╨╜╨╕╤П
<source lang="javascript">
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
#check for exists cookie
#get and check
SetEnvIf Cookie "websocket-allowed=(.*)" env-var-name=$1
#or rewrite rule
RewriteCond %{HTTP_COOKIE} !^.*mycookie.*$
#or if
<If "%{HTTP_COOKIE} =~ /(^|; )cookie-names*=s*some-val(;|$)/ >
</If
</If>
</If>
рдЪрд╛рдЪрдгреАрдиреЗ рджрд░реНрд╢рд╡рд┐рд▓реЗ рдХреА рддреЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ. рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рджреНрд╡рд╛рд░реЗ рдХреБрдХреАрдЬ рд╕реНрд╡рддрдГрдХрдбреЗ рд╣рд╕реНрддрд╛рдВрддрд░рд┐рдд рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ.
3. рдПрдХ рдкреНрд░реЙрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрд╡реНрд╣рд░ (рдХреЗрд╡рд│ рдЕрдВрдЧрднреВрдд рдореЙрдбреНрдпреВрд▓ рдЖрдгрд┐ рдХрд╛рд░реНрдпреЗ) рд╡рд╛рдкрд░реВрди рддрд╛рддреНрдкреБрд░рддреА рд╕рддреНрд░реЗ рд▓рд╛рдЧреВ рдХреЗрд▓реА рдЬрд╛рдК рд╢рдХрддрд╛рдд.
рдЖрдореНтАНрд╣рд╛рд▓рд╛ рдЖрдзреА рдХрд│рд▓реНтАНрдпрд╛рдкреНрд░рдорд╛рдгреЗ, рдЕрдкрд╛рдЪреЗрдордзреНтАНрдпреЗ рдмрд░реАрдЪ рдХреЛрд░ рдлрдВрдХреНрд╢рдиреЕрд▓рд┐рдЯреА рдЖрд╣реЗ рдЬреА рддреБрдореНрд╣рд╛рд▓рд╛ рдХрдВрдбрд┐рд╢рдирд▓ рдХрдВрд╕реНрдЯреНрд░рдХреНтАНрдЯ рддрдпрд╛рд░ рдХрд░реВ рджреЗрддреЗ. рддрдерд╛рдкрд┐, рдЖрдореНрд╣рд╛рд▓рд╛ рдЖрдордЪреА рдорд╛рд╣рд┐рддреА рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рдмреНрд░рд╛рдЙрдЭрд░рдордзреНрдпреЗ рдЕрд╕рддрд╛рдирд╛ рд╕рдВрд░рдХреНрд╖рд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕рд╛рдзрдирд╛рдВрдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ, рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рдХрд╛рдп рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХрд░рд╛рдпрдЪреЗ рдЖрдгрд┐ рдХрд╛, рдЖрдгрд┐ рдЖрдореНрд╣реА рдХреЛрдгрддреА рдЕрдВрдЧрднреВрдд рдлрдВрдХреНрд╢рдиреНрд╕ рд╡рд╛рдкрд░реВ:
- рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗ рд╕рд╣рдЬрдкрдгреЗ рдбреАрдХреЛрдб рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрдд рдирд╛рд╣реА.
- рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреНрдпрд╛рдордзреНрдпреЗ рдЕрдкреНрд░рдЪрд▓рд┐рддрдкрдгрд╛ рдЕрдВрддрд░реНрднреВрдд рдЖрд╣реЗ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрдкреНрд░рдЪрд▓рд┐рддрдкрдгрд╛ рддрдкрд╛рд╕рдгреНрдпрд╛рдЪреА рдХреНрд╖рдорддрд╛ рдЖрд╣реЗ.
- рдЖрдореНрд╣рд╛рд▓рд╛ рдПрдХ рдЯреЛрдХрди рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рдЬреЗ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдЪреНрдпрд╛ рдорд╛рд▓рдХрд╛рд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЕрд╕реЗрд▓.
рдпрд╛рд╕рд╛рдареА рд╣реЕрд╢рд┐рдВрдЧ рдлрдВрдХреНрд╢рди, рдореАрда рдЖрдгрд┐ рдЯреЛрдХрди рд╡рдпрд╛рдЪреА рддрд╛рд░реАрдЦ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдХрд╛рдЧрджрдкрддреНрд░рд╛рдВрд╡рд░ рдЖрдзрд╛рд░рд┐рдд
рдкрд░рд┐рдгрд╛рдо рд╣реЗ рдбрд┐рдЭрд╛рдЗрди рд╣реЛрддреЗ:
#╨╜╨╡╤В ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░, ╨╕ ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ websocket
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
SetEnvIf Cookie "zt-cert-sha1=([^;]+)" zt-cert-sha1=$1
SetEnvIf Cookie "zt-cert-uid=([^;]+)" zt-cert-uid=$1
SetEnvIf Cookie "zt-cert-date=([^;]+)" zt-cert-date=$1
#╤В╨╛╨╗╤М╨║╨╛ ╤В╨░╨║ ╨╝╨╛╨╢╨╜╨╛ ╤А╨░╨▒╨╛╤В╨░╤В╤М ╤Б ╨┐╨╡╤А╨╡╨╝╨╡╨╜╨╜╤Л╨╝╨╕, ╨┐╨╛╨╗╤Г╤З╨╡╨╜╨╜╤Л╨╝╨╕ ╨▓ env-╨░╤Е ╨▓ ╤Н╤В╨╛╤В ╨╝╨╛╨╝╨╡╨╜╤В ╨▓╤А╨╡╨╝╨╡╨╜╨╕, ╨▒╨╛╨╗╨╡╨╡ ╨╛╨╜╨╕ ╨╜╨╕╨│╨┤╨╡ ╨╜╨╡ ╨┤╨╛╤Б╤В╤Г╨┐╨╜╤Л ╨┤╨╗╤П ╤Д╤Г╨╜╨║╤Ж╨╕╨╕ ╤Е╨╡╤И╨╕╤А╨╛╨▓╨░╨╜╨╕╤П (╨┐╨╛ ╨╛╤В╨┤╨╡╨╗╤М╨╜╨╛╤Б╤В╨╕ ╨╝╨╛╨╢╨╜╨╛, ╨╜╨╛ ╨╜╨╡ ╨▓╨╝╨╡╤Б╤В╨╡, ╨┤╨░ ╨╕ ╨╡╤Й╤С ╤Б ╤Е╨╡╤И╨╕╤А╨╛╨▓╨░╨╜╨╕╨╡╨╝)
<RequireAll>
Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
</RequireAll>
</If>
</If>
#╨╡╤Б╤В╤М ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В, ╨╖╨░╨┐╤А╨░╤И╨╕╨▓╨░╨╡╤В╤Б╤П ╨╜╨╡ websocket
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
SetEnvIf Cookie "zt-cert-sha1=([^;]+)" HAVE_zt-cert-sha1=$1
SetEnv zt_cert "path=/; HttpOnly;Secure;SameSite=Strict"
#╨Э╨╛╨▓╤Л╨╡ ╨║╤Г╨║╨╕ ╤Б╤В╨░╨▓╤П╤В╤Б╤П, ╨╡╤Б╨╗╨╕ ╤Б╤В╨░╤А╤Л╤Е ╨╜╨╡╤В
Header add Set-Cookie "expr=zt-cert-sha1=%{sha1:salt1%{TIME}salt3%{SSL_CLIENT_S_DN_CN}salt2};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
Header add Set-Cookie "expr=zt-cert-uid=%{SSL_CLIENT_S_DN_CN};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
Header add Set-Cookie "expr=zt-cert-date=%{TIME};%{env:zt_cert}" env=!HAVE_zt-cert-sha1
</If>
</If>
рдзреНрдпреЗрдп рд╕рд╛рдзреНрдп рдЭрд╛рд▓реЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╕рд░реНрд╡реНрд╣рд░рдЪреНрдпрд╛ рдЕрдкреНрд░рдЪрд▓рд┐рддрддреЗрд╕рд╣ рд╕рдорд╕реНрдпрд╛ рдЖрд╣реЗрдд (рдЖрдкрдг рдПрдХ рд╡рд░реНрд╖ рдЬреБрдиреА рдХреБрдХреА рд╡рд╛рдкрд░реВ рд╢рдХрддрд╛), рдпрд╛рдЪрд╛ рдЕрд░реНрде рдЯреЛрдХрди, рдЬрд░реА рдЕрдВрддрд░реНрдЧрдд рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рд╕реБрд░рдХреНрд╖рд┐рдд рдЕрд╕рд▓реЗ рддрд░реА, рдФрджреНрдпреЛрдЧрд┐рдХ (рд╡рд╕реНрддреБрдорд╛рди) рд╡рд╛рдкрд░рд╛рд╕рд╛рдареА рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЖрд╣реЗрдд.
4. рддрд╛рддреНрдкреБрд░рддреЗ рд╕рддреНрд░ рдЯреЛрдХрди рдЖрдзреАрдЪ рддрдпрд╛рд░-рддрдпрд╛рд░ Apache рдореЙрдбреНрдпреВрд▓ рдореНрд╣рдгреВрди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЧреЗрд▓реЗ рдЖрд╣реЗрдд.
рдорд╛рдЧреАрд▓ рдкреБрдирд░рд╛рд╡реГрддреНрддреАрдкрд╛рд╕реВрди рдПрдХ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рд░рд╛рд╣рд┐рд▓реА - рдЯреЛрдХрди рд╡реГрджреНрдзрддреНрд╡ рдирд┐рдпрдВрддреНрд░рд┐рдд рдХрд░рдгреНрдпрд╛рд╕ рдЕрд╕рдорд░реНрдерддрд╛.
рдЖрдореНрд╣реА рдПрдХ рд░реЗрдбреАрдореЗрдб рдореЙрдбреНрдпреВрд▓ рд╢реЛрдзрдд рдЖрд╣реЛрдд рдЬреЗ рдЕрд╕реЗ рдХрд░рддреЗ, рдпрд╛ рд╢рдмреНрджрд╛рдВрдиреБрд╕рд╛рд░: apache token json two factor auth
JSON рд╡реЗрдм рдЯреЛрдХрдирд╡рд░ рдЖрдзрд╛рд░рд┐рдд рдЯреЛрдХрди рд╡рд╛рдкрд░реВрди рдХреНрд▓рд╛рдпрдВрдЯ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЕрдкрд╛рдЪреЗ рдЯреВ-рдлреЕрдХреНрдЯрд░ (2FA) рдкреНрд░рдорд╛рдгреАрдХрд░рдг Apache рдордзреНрдпреЗ рдЯреВ-рдлреЕрдХреНрдЯрд░ рдСрдереЗрдВрдЯрд┐рдХреЗрд╢рди рдХрд╕реЗ рдЬреЛрдбрд╛рдпрдЪреЗ рд╕рд╛рдзреНрдпрд╛ рдореЙрдбреНрдпреВрд▓ рдЗрдиреНрд╕реНрдЯреЙрд▓рд╕рд╣ рддреБрдордЪреНрдпрд╛ Apache рдЙрджрд╛рд╣рд░рдгрд╛рдордзреНрдпреЗ рджреНрд╡рд┐-рдШрдЯрдХ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдЖрдгрд╛
рд╣реЛрдп, рддреЗрдереЗ рд░реЗрдбреАрдореЗрдб рдореЙрдбреНрдпреВрд▓реНрд╕ рдЖрд╣реЗрдд, рдкрд░рдВрддреБ рддреЗ рд╕рд░реНрд╡ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХреНрд░рд┐рдпрд╛рдВрд╢реА рдЬреЛрдбрд▓реЗрд▓реЗ рдЖрд╣реЗрдд рдЖрдгрд┐ рдПрдХ рд╕рддреНрд░ рдЖрдгрд┐ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдХреАрдЬ рд╕реБрд░реВ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рдХрд▓рд╛рдХреГрддреА рдЖрд╣реЗрдд. рдореНрд╣рдгрдЬреЗ рдХрд╛рд╣реА рдХрд╛рд│рд╛рд╕рд╛рдареА рдирд╛рд╣реА.
рдЖрдореНрд╣рд╛рд▓рд╛ рд╢реЛрдзрдгреНрдпрд╛рд╕рд╛рдареА рдкрд╛рдЪ рддрд╛рд╕ рд▓рд╛рдЧрд▓реЗ, рдЬреНрдпрд╛рдореБрд│реЗ рдареЛрд╕ рдкрд░рд┐рдгрд╛рдо рдорд┐рд│рд╛рд▓рд╛ рдирд╛рд╣реА.
5. рддрд╛рддреНрдкреБрд░рддреА рд╕рддреНрд░ рдЯреЛрдХрди рддрд╛рд░реНрдХрд┐рдХрд░рд┐рддреНрдпрд╛ рдкрд░рд╕реНрдкрд░рд╕рдВрд╡рд╛рджрд╛рдЪреА рд░рдЪрдирд╛ рддрдпрд╛рд░ рдХрд░реВрди рд▓рд╛рдЧреВ рдХреЗрд▓реЗ рдЬрд╛рдК рд╢рдХрддрд╛рдд.
рд░реЗрдбреАрдореЗрдб рдореЙрдбреНрдпреВрд▓ рдЦреВрдк рдХреНрд▓рд┐рд╖реНрдЯ рдЖрд╣реЗрдд, рдХрд╛рд░рдг рдЖрдореНрд╣рд╛рд▓рд╛ рдлрдХреНрдд рджреЛрди рдлрдВрдХреНрд╢рдиреНрд╕рдЪреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдЖрд╣реЗ.
рдЕрд╕реЗ рдореНрд╣рдЯрд▓реЗ рдЬрд╛рдд рдЖрд╣реЗ рдХреА, рддрд╛рд░рдЦреЗрдЪреА рд╕рдорд╕реНрдпрд╛ рдЕрд╢реА рдЖрд╣реЗ рдХреА Apache рдЪреА рдЕрдВрдЧрднреВрдд рдлрдВрдХреНрд╢рдиреНрд╕ рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рддрд╛рд░реАрдЦ рддрдпрд╛рд░ рдХрд░рдгреНрдпрд╛рд╕ рдкрд░рд╡рд╛рдирдЧреА рджреЗрдд тАЛтАЛтАЛтАЛрдирд╛рд╣реАрдд рдЖрдгрд┐ рдЕрдкреНрд░рдЪрд▓рд┐рддрддрд╛ рддрдкрд╛рд╕рддрд╛рдирд╛ рдЕрдВрдЧрднреВрдд рдлрдВрдХреНрд╢рдиреНрд╕рдордзреНрдпреЗ рдХреЛрдгрддреАрд╣реА рдЧрдгрд┐рддреА рдмреЗрд░реАрдЬ/рд╡рдЬрд╛рдмрд╛рдХреА рдирд╛рд╣реА.
рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдкрдг рд▓рд┐рд╣реВ рд╢рдХрдд рдирд╛рд╣реА:
(%{env:zt-cert-date} + 30) > %{DATE}
рддреБрдореНрд╣реА рдлрдХреНрдд рджреЛрди рд╕рдВрдЦреНрдпрд╛рдВрдЪреА рддреБрд▓рдирд╛ рдХрд░реВ рд╢рдХрддрд╛.
рд╕рдлрд╛рд░реА рд╕рдорд╕реНрдпреЗрд╕рд╛рдареА рдЙрдкрд╛рдп рд╢реЛрдзрдд рдЕрд╕рддрд╛рдирд╛, рдорд▓рд╛ рдПрдХ рдордиреЛрд░рдВрдЬрдХ рд▓реЗрдЦ рд╕рд╛рдкрдбрд▓рд╛:
рд╣реЗ Nginx рд╕рд╛рдареА рд▓реБрдЖ рдордзреАрд▓ рдХреЛрдбрдЪреНрдпрд╛ рдЙрджрд╛рд╣рд░рдгрд╛рдЪреЗ рд╡рд░реНрдгрди рдХрд░рддреЗ рдЖрдгрд┐ рддреЗ рдЬрд╕реЗ рдХреА, рд╣реЕрд╢рд┐рдВрдЧрд╕рд╛рдареА hmac рд╕реЙрд▓реНрдЯрд┐рдВрдЧ рдкрджреНрдзрддреАрдЪрд╛ рд╡рд╛рдкрд░ рд╡рдЧрд│рддрд╛, рдЖрдореНрд╣реА рдЖрдзреАрдЪ рд▓рд╛рдЧреВ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдЪреНрдпрд╛ рддреНрдпрд╛ рднрд╛рдЧрд╛рдЪреНрдпрд╛ рддрд░реНрдХрд╛рдЪреА рдкреБрдирд░рд╛рд╡реГрддреНрддреА рдХрд░рддреЗ ( рд╣реЗ Apache рдордзреНрдпреЗ рдЖрдврд│рд▓реЗ рдирд╛рд╣реА).
рд╣реЗ рд╕реНрдкрд╖реНрдЯ рдЭрд╛рд▓реЗ рдХреА рд▓реБрдЖ рд╣реА рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХрд╢рд╛рд╕реНрддреНрд░ рдЕрд╕рд▓реЗрд▓реА рднрд╛рд╖рд╛ рдЖрд╣реЗ рдЖрдгрд┐ рдЕрдкрд╛рдЪреЗрд╕рд╛рдареА рдХрд╛рд╣реАрддрд░реА рд╕реЛрдкреЗ рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ:
Nginx рдЖрдгрд┐ Apache рдордзреАрд▓ рдлрд░рдХрд╛рдЪрд╛ рдЕрднреНрдпрд╛рд╕ рдХреЗрд▓реНрдпрд╛рд╡рд░:
рдЖрдгрд┐ рд▓реБрдЖ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рддреНрдпрд╛рдХрдбреВрди рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпреЗ:
рд╡рд░реНрддрдорд╛рдирд╛рд╢реА рддреБрд▓рдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рддрд╛рд░реАрдЦ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣рд╛рд▓рд╛ рд▓рд╣рд╛рди рд▓реБрдЖ рдлрд╛рдЗрд▓рдордзреНрдпреЗ env рд╡реНрд╣реЗрд░рд┐рдПрдмрд▓реНрд╕ рд╕реЗрдЯ рдХрд░рдгреНрдпрд╛рдЪрд╛ рдорд╛рд░реНрдЧ рд╕рд╛рдкрдбрд▓рд╛.
рд╕рд╛рдзреА рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЕрд╢реА рджрд┐рд╕рддреЗ:
require 'apache2'
function handler(r)
local fmt = '%Y%m%d%H%M%S'
local timeout = 3600 -- 1 hour
r.notes['zt-cert-timeout'] = timeout
r.notes['zt-cert-date-next'] = os.date(fmt,os.time()+timeout)
r.notes['zt-cert-date-halfnext'] = os.date(fmt,os.time()+ (timeout/2))
r.notes['zt-cert-date-now'] = os.date(fmt,os.time())
return apache2.OK
end
рдЖрдгрд┐ рдХреБрдХреАрдЬрдЪреНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдЪреЗ рдСрдкреНрдЯрд┐рдорд╛рдпрдЭреЗрд╢рди рдЖрдгрд┐ рдЬреБрдиреА рдХреБрдХреА (рдЯреЛрдХрди) рдХрд╛рд▓рдмрд╛рд╣реНрдп рд╣реЛрдгреНрдпрд╛рдкреВрд░реНрд╡реА рдЕрд░реНрдзрд╛ рд╡реЗрд│ рдЖрд▓реНрдпрд╛рд╡рд░ рдЯреЛрдХрди рдмрджрд▓реВрди рд╣реЗ рд╕рд░реНрд╡ рдПрдХреВрдг рдХрд╕реЗ рдХрд╛рд░реНрдп рдХрд░рддреЗ:
SSLVerifyClient optional
#LuaScope thread
#generate event variables zt-cert-date-next
LuaHookAccessChecker /usr/local/etc/apache24/sslincludes/websocket_token.lua handler early
#╨╖╨░╨┐╤А╨╡╤Й╨░╨╡╨╝ ╨▒╨╡╨╖ ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╤З╤В╨╛-╤В╨╛ ╨╡╤Й╤С, ╨║╤А╨╛╨╝╨╡ webscoket
RewriteEngine on
RewriteCond %{SSL:SSL_CLIENT_VERIFY} !=SUCCESS
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
RewriteRule .? - [F]
#ErrorDocument 403 "You need a client side certificate issued by CAcert to access this site"
#websocket for safari without certauth
<If "%{SSL:SSL_CLIENT_VERIFY} != 'SUCCESS'">
<If "%{HTTP:Upgrade} = 'websocket'">
SetEnvIf Cookie "zt-cert=([^,;]+),([^,;]+),[^,;]+,([^,;]+)" zt-cert-sha1=$1 zt-cert-date=$2 zt-cert-uid=$3
<RequireAll>
Require expr %{sha1:salt1%{env:zt-cert-date}salt3%{env:zt-cert-uid}salt2} == %{env:zt-cert-sha1}
Require expr %{env:zt-cert-sha1} =~ /^.{40}$/
Require expr %{env:zt-cert-date} -ge %{env:zt-cert-date-now}
</RequireAll>
#╨╖╨░╨╝╨╡╤Й╨░╨╡╨╝ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨▓╨╗╨░╨┤╨╡╨╗╤М╤Ж╤Г ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░ ╨╜╨░ ╨░╨▓╤В╨╛╤А╨╕╨╖╨░╤Ж╨╕╤О ╨┐╨╛ ╨╜╨╛╨╝╨╡╤А╤Г ╨┐╤А╨╛╤В╨╛╨║╨╛╨╗╨░
SSLUserName SSl_PROTOCOL
SSLOptions -FakeBasicAuth
</If>
</If>
<If "%{SSL:SSL_CLIENT_VERIFY} = 'SUCCESS'">
<If "%{HTTP:Upgrade} != 'websocket'">
SetEnvIf Cookie "zt-cert=([^,;]+),[^,;]+,([^,;]+)" HAVE_zt-cert-sha1=$1 HAVE_zt-cert-date-halfnow=$2
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
Define zt-cert "path=/;Max-Age=%{env:zt-cert-timeout};HttpOnly;Secure;SameSite=Strict"
Define dates_user "%{env:zt-cert-date-next},%{env:zt-cert-date-halfnext},%{SSL_CLIENT_S_DN_CN}"
Header set Set-Cookie "expr=zt-cert=%{sha1:salt1%{env:zt-cert-date-next}sal3%{SSL_CLIENT_S_DN_CN}salt2},${dates_user};${zt-cert}" env=!HAVE_zt-cert-sha1-found
</If>
</If>
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge %{TIME} && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
╤А╨░╨▒╨╛╤В╨░╨╡╤В,
╨░ ╤В╨░╨║ ╤А╨░╨▒╨╛╤В╨░╤В╤М ╨╜╨╡ ╨▒╤Г╨┤╨╡╤В
SetEnvIfExpr "env('HAVE_zt-cert-date-halfnow') -ge env('zt-cert-date-now') && env('HAVE_zt-cert-sha1')=~/.{40}/" HAVE_zt-cert-sha1-found=1
рдХрд╛рд░рдг LuaHookAccessChecker Nginx рдХрдбреАрд▓ рдорд╛рд╣рд┐рддреАрдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рдкреНрд░рд╡реЗрд╢ рддрдкрд╛рд╕рд▓реНрдпрд╛рдирдВрддрд░рдЪ рд╕рдХреНрд░рд┐рдп рдХреЗрд▓реЗ рдЬрд╛рдИрд▓.
рд╕реНрддреНрд░реЛрддрд╛рд╢реА рджреБрд╡рд╛
рдЖрдгрдЦреА рдПрдХ рдЧреЛрд╖реНрдЯ.
рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ, рдЕрдкрд╛рдЪреЗ (рдХрджрд╛рдЪрд┐рдд Nginx рджреЗрдЦреАрд▓) рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рдирдордзреНрдпреЗ рдирд┐рд░реНрджреЗрд╢ рдХреЛрдгрддреНрдпрд╛ рдХреНрд░рдорд╛рдиреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реЗ рдЖрд╣реЗрдд рдпрд╛рдиреЗ рдХрд╛рд╣реА рдлрд░рдХ рдкрдбрдд рдирд╛рд╣реА, рдХрд╛рд░рдг рд╢реЗрд╡рдЯреА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдЪреНрдпрд╛ рд╡рд┐рдирдВрддреАрдиреБрд╕рд╛рд░ рдХреНрд░рдорд╡рд╛рд░реА рд▓рд╛рд╡рд▓реА рдЬрд╛рдИрд▓, рдЬреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдпреЛрдЬрдиреЗрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЖрд╣реЗ. рд▓реБрдЖ рд╕реНрдХреНрд░рд┐рдкреНрдЯреНрд╕.
рдкреВрд░реНрдгрддрд╛:
рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдирдВрддрд░ рджреГрд╢реНрдпрдорд╛рди рд╕реНрдерд┐рддреА (рдзреНрдпреЗрдп):
рд╕реЗрд╡рд╛ рдЖрдгрд┐ рдкрд╛рдпрд╛рднреВрдд рд╕реБрд╡рд┐рдзрд╛рдВрдЪреЗ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдореЛрдмрд╛рдЗрд▓ рдлреЛрдирд╡рд░реВрди IOS рд╡рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдкреНрд░реЛрдЧреНрд░рд╛рдорд╢рд┐рд╡рд╛рдп (VPN), рдпреБрдирд┐рдлрд╛рдЗрдб рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ.
рдЙрджреНрджрд┐рд╖реНрдЯ рд╕рд╛рдзреНрдп рдЭрд╛рд▓реЗ рдЖрд╣реЗ, рд╡реЗрдм рд╕реЙрдХреЗрдЯреНрд╕ рдХрд╛рд░реНрдп рдХрд░рддрд╛рдд рдЖрдгрд┐ рд╕реБрд░рдХреНрд╖рд┐рддрддреЗрдЪреА рдкрд╛рддрд│реА рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╛рдкреЗрдХреНрд╖рд╛ рдХрдореА рдирд╛рд╣реА.
рд╕реНрддреНрд░реЛрдд: www.habr.com