рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

╨б╤В╨░╤В╤М╤П ╨▒╤Г╨┤╨╡╤В ╨┐╨╛╨╗╨╡╨╖╨╜╨░ ╤В╨╡╨╝, ╨║╤В╨╛:

  • рдХреНрд▓рд╛рдЗрдиреНрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХреЗ рд╣реЛ рдерд╛рд╣рд╛ рдЫ рд░ рдпрд╕рд▓рд╛рдИ рдореЛрдмрд╛рдЗрд▓ рд╕рдлрд╛рд░реАрдорд╛ рдХрд┐рди рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫ рднрдиреЗрд░ рдмреБрдЭреНрджрдЫ;
  • рдо рд╡реЗрдм рд╕реЗрд╡рд╛рд╣рд░реВ рд╕реАрдорд┐рдд рд╡реНрдпрдХреНрддрд┐рд╣рд░реВрдХреЛ рд╕рд░реНрдХрд▓рдорд╛ рд╡рд╛ рдореЗрд░реЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдкреНрд░рдХрд╛рд╢рд┐рдд рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ;
  • рд╕реЛрдЪреНрджрдЫ рдХрд┐ рд╕рдмреИ рдХреБрд░рд╛ рдкрд╣рд┐рд▓реЗ рдиреИ рдХрд╕реИрд▓реЗ рдЧрд░рд┐рд╕рдХреЗрдХреЛ рдЫ, рд░ рд╕рдВрд╕рд╛рд░рд▓рд╛рдИ рдЕрд▓рд┐ рдмрдвреА рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдмрдирд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫред

рд╡реЗрдмрд╕рдХреЗрдЯрдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рд▓рдЧрднрдЧ 8 рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ рд╕реБрд░реБ рднрдпреЛред рдкрд╣рд┐рд▓реЗ, рд╡рд┐рдзрд┐рд╣рд░реВ рд▓рд╛рдореЛ http рдЕрдиреБрд░реЛрдзрд╣рд░реВ (рд╡рд╛рд╕реНрддрд╡рдорд╛ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛рд╣рд░реВ) рдХреЛ рд░реВрдкрдорд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдереНрдпреЛ: рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдмреНрд░рд╛рдЙрдЬрд░рд▓реЗ рд╕рд░реНрднрд░рдорд╛ рдЕрдиреБрд░реЛрдз рдкрдард╛рдпреЛ рд░ рдХреЗрд╣рд┐ рдЬрд╡рд╛рдл рджрд┐рдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд░рддрд┐рдХреНрд╖рд╛ рдЧрд░реНтАНрдпреЛ, рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдкрдЫрд┐ рдпреЛ рдлреЗрд░рд┐ рдЬрдбрд╛рди рднрдпреЛ рд░ рдкрд░реНрдЦрд┐рдпреЛред рддрд░ рддреНрдпрд╕рдкрдЫрд┐ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВ рджреЗрдЦрд╛ рдкрд░реНрдпреЛред

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

рдХреЗрд╣рд┐ рд╡рд░реНрд╖ рдкрд╣рд┐рд▓реЗ, рд╣рд╛рдореАрд▓реЗ рд╢реБрджреНрдз PHP рдорд╛ рд╣рд╛рдореНрд░реЛ рдЖрдлреНрдиреИ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╡рд┐рдХрд╛рд╕ рдЧрд░реНрдпреМрдВ, рдЬрд╕рд▓реЗ https рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрджреИрди, рдХрд┐рдирдХрд┐ рдпреЛ рд▓рд┐рдЩреНрдХ рддрд╣ рд╣реЛред рдзреЗрд░реИ рд╕рдордп рдЕрдШрд┐, рд▓рдЧрднрдЧ рд╕рдмреИ рд╡реЗрдм рд╕рд░реНрднрд░рд╣рд░реВрд▓реЗ рдкреНрд░реЛрдХреНрд╕реА рдЕрдиреБрд░реЛрдзрд╣рд░реВ https рд░ рд╕рдорд░реНрдерди рдЬрдбрд╛рди: рдЕрдкрдЧреНрд░реЗрдб рдЧрд░реНрди рд╕рд┐рдХреЗрдХрд╛ рдерд┐рдПред

рдЬрдм рдпреЛ рднрдпреЛ, рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВ SPA рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд▓рдЧрднрдЧ рдкреВрд░реНрд╡рдирд┐рд░реНрдзрд╛рд░рд┐рдд рд╕реЗрд╡рд╛ рднрдпреЛ, рдХрд┐рдирднрдиреЗ рд╕рд░реНрднрд░рдХреЛ рдкрд╣рд▓рдорд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд▓рд╛рдИ рд╕рд╛рдордЧреНрд░реА рдЙрдкрд▓рдмреНрдз рдЧрд░рд╛рдЙрди рдХрддреНрддрд┐рдХреЛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдЫ (рдЕрд░реНрдХреЛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдмрд╛рдЯ рд╕рдиреНрджреЗрд╢ рдкрдард╛рдЙрдиреБрд╣реЛрд╕реН рд╡рд╛ рдЫрд╡рд┐, рдХрд╛рдЧрдЬрд╛рдд, рдкреНрд░рд╕реНрддреБрддреАрдХрд░рдгрдХреЛ рдирдпрд╛рдБ рд╕рдВрд╕реНрдХрд░рдг рдбрд╛рдЙрдирд▓реЛрдб рдЧрд░реНрдиреБрд╣реЛрд╕реНред рдХрд┐ рдЕрд░реВ рдХрд╕реИрд▓реЗ рд╣рд╛рд▓ рд╕рдореНрдкрд╛рджрди рдЧрд░рд┐рд░рд╣реЗрдХреЛ рдЫ)ред

рдпрджреНрдпрдкрд┐ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯ рдзреЗрд░реИ рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд░рд┐рдкрд░рд┐ рд░рд╣реЗрдХреЛ рдЫ, рдпреЛ рдЕрдЭреИ рдкрдирд┐ рдХрдордЬреЛрд░ рд░реВрдкрдорд╛ рд╕рдорд░реНрдерд┐рдд рдЫ, рдХрд┐рдирдХрд┐ рдпрд╕рд▓рд╛рдИ рдмрд╛рдЗрдкрд╛рд╕ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реНрджрд╛ рдпрд╕рд▓реЗ рдзреЗрд░реИ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрджрдЫред рд░ (рд╕рдореНрднрд╡рддрдГ :slightly_smiling_face: ) рддреНрдпрд╕реИрд▓реЗ IOS рдмреНрд░рд╛рдЙрдЬрд░рд╣рд░реВ (рд╕рдлрд╛рд░реА рдмрд╛рд╣реЗрдХ рд╕рдмреИ) рдпрд╕рд▓рд╛рдИ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд░ рд╕реНрдерд╛рдиреАрдп рдкреНрд░рдорд╛рдгрдкрддреНрд░ рднрдгреНрдбрд╛рд░рдмрд╛рдЯ рдЕрдиреБрд░реЛрдз рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрдирдиреНред рд▓рдЧрдЗрди/рдкрд╛рд╕ рд╡рд╛ ssh рдХреБрдЮреНрдЬреАрд╣рд░реВ рд╡рд╛ рдлрд╛рдпрд░рд╡рд╛рд▓ рдорд╛рд░реНрдлрдд рдЖрд╡рд╢реНрдпрдХ рдкреЛрд░реНрдЯрд╣рд░реВ рдмрдиреНрдж рдЧрд░реНрдиреЗ рддреБрд▓рдирд╛рдорд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╣рд░реВрд╕рдБрдЧ рдзреЗрд░реИ рдлрд╛рдЗрджрд╛рд╣рд░реВ рдЫрдиреНред рддрд░ рдпреЛ рдХреЗ рдмрд╛рд░реЗ рдорд╛ рдЫреИрдиред

рдЖрдИрдУрдПрд╕рдорд╛, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреЗ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдПрдХрджрдо рд╕рд░рд▓ рдЫ (рд╡рд┐рд╢рд┐рд╖реНрдЯ рдмрд┐рдирд╛ рд╣реЛрдЗрди), рддрд░ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдпреЛ рдирд┐рд░реНрджреЗрд╢рди рдЕрдиреБрд╕рд╛рд░ рдЧрд░рд┐рдиреНрдЫ, рдЬрд╕рдордзреНрдпреЗ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдзреЗрд░реИ рдЫрдиреН рд░ рд╕рдлрд╛рд░реА рдмреНрд░рд╛рдЙрдЬрд░рдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рддреНрд░ рдЙрдкрд▓рдмреНрдз рдЫрдиреНред рджреБрд░реНрднрд╛рдЧреНрдпрд╡рд╢, рд╕рдлрд╛рд░реАрд▓рд╛рдИ рд╡реЗрдм рд╕рдХреЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯ рдХрд╕рд░реА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдерд╛рд╣рд╛ рдЫреИрди, рддрд░ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рдпрд╕реНрддреЛ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдХрд╕рд░реА рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрдиреЗ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдзреЗрд░реИ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ рдЫрдиреН, рддрд░ рд╡реНрдпрд╡рд╣рд╛рд░рдорд╛ рдпреЛ рдЕрдкреНрд░рд╛рдкреНрдп рдЫред

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВ рдмреБрдЭреНрди, рд╣рд╛рдореАрд▓реЗ рдирд┐рдореНрди рдпреЛрдЬрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдпреМрдВ: рд╕рдорд╕реНрдпрд╛/рдкрд░рд┐рдХрд▓реНрдкрдирд╛/рд╕рдорд╛рдзрд╛рдиред

рд╕рдорд╕реНрдпрд╛: IOS рд░ рдЕрдиреНрдп рдЕрдиреБрдкреНрд░рдпреЛрдЧрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдлрд╛рд░реА рдореЛрдмрд╛рдЗрд▓ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрджреНрд╡рд╛рд░рд╛ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░рд┐рдПрдХрд╛ рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдкреНрд░реЛрдХреНрд╕реА рдЕрдиреБрд░реЛрдз рдЧрд░реНрджрд╛ рд╡реЗрдм рд╕рдХреЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдХреБрдиреИ рд╕рдорд░реНрдерди рдЫреИрдиред

рдкрд░рд┐рдХрд▓реНрдкрдирд╛рд╣рд░реВ:

  1. рдпрд╕реНрддреЛ рдЕрдкрд╡рд╛рдж рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ (рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкрдирд┐ рд╣реБрдиреЗ рдЫреИрди рднрдиреЗрд░ рдерд╛рд╣рд╛ рдЫ) рдЖрдиреНрддрд░рд┐рдХ/рдмрд╛рд╣реНрдп рдкреНрд░реЛрдХреНрд╕реА рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрдорд╛ред
  2. рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рддрдкрд╛рдЗрдБ рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдПрдХ рдЕрджреНрд╡рд┐рддреАрдп, рд╕реБрд░рдХреНрд╖рд┐рдд рд░ рд╕реБрд░рдХреНрд╖рд┐рдд рдЬрдбрд╛рди рдмрдирд╛рдЙрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ рдЬреБрди рд╕рд╛рдорд╛рдиреНрдп (рдЧреИрд░-рд╡реЗрдмрд╕рдХреЗрдЯ) рдмреНрд░рд╛рдЙрдЬрд░ рдЕрдиреБрд░реЛрдзрдХреЛ рд╕рдордпрдорд╛ рдЙрддреНрдкрдиреНрди рд╣реБрдиреНрдЫред
  3. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░рд╣рд░реВ рдПрдХ рдкреНрд░реЛрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрднрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ (рдирд┐рд░реНрдорд┐рдд рдореЛрдбреНрдпреБрд▓ рд░ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдорд╛рддреНрд░)ред
  4. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрдирд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд Apache рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫред
  5. рддрд╛рд░реНрдХрд┐рдХ рд░реВрдкрдорд╛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛ рд╕рдВрд░рдЪрдирд╛ рдбрд┐рдЬрд╛рдЗрди рдЧрд░реЗрд░ рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрдирд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрдЫрд┐ рджреЗрдЦрд┐рдиреЗ рдЕрд╡рд╕реНрдерд╛ред

рдХрд╛рд░реНрдпрдХреЛ рд▓рдХреНрд╖реНрдп: рд╕реЗрд╡рд╛рд╣рд░реВ рд░ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рд╣рд░реВрдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ (рдЬрд╕реНрддреИ VPN) рдмрд┐рдирд╛ IOS рдорд╛ рдореЛрдмрд╛рдЗрд▓ рдлреЛрдирдмрд╛рдЯ рдкрд╣реБрдБрдЪрдпреЛрдЧреНрдп рд╣реБрдиреБрдкрд░реНрдЫ, рдПрдХреАрдХреГрдд рд░ рд╕реБрд░рдХреНрд╖рд┐рддред

рдЕрддрд┐рд░рд┐рдХреНрдд рд▓рдХреНрд╖реНрдп: рд╕рдордп рд░ рд╕реНрд░реЛрддрд╣рд░реВ/рдлреЛрди рдЯреНрд░рд╛рдлрд┐рдХ рдмрдЪрдд рдЧрд░реНрджреИ (рд╡реЗрдм тАЛтАЛрд╕рдХреЗрдЯ рдмрд┐рдирд╛ рдХреЗрд╣реА рд╕реЗрд╡рд╛рд╣рд░реВрд▓реЗ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдЕрдиреБрд░реЛрдзрд╣рд░реВ рдЙрддреНрдкрдиреНрди рдЧрд░реНрджрдЫ) рдореЛрдмрд╛рдЗрд▓ рдЗрдиреНрдЯрд░рдиреЗрдЯрдорд╛ рд╕рд╛рдордЧреНрд░реАрдХреЛ рдЫрд┐рдЯреЛ рдбреЗрд▓рд┐рднрд░реАрдХреЛ рд╕рд╛рдеред

рдХрд╕рд░реА рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рд╣реЛ?

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. рд╡рд╛ рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛ рдХрдиреНрд╕реЛрд▓рдорд╛:

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

рдкрд░рд┐рдХрд▓реНрдкрдирд╛ рдкрд░реАрдХреНрд╖рдг:

1. рдЖрдиреНрддрд░рд┐рдХ/рдмрд╛рд╣реНрдп рдкреНрд░реЛрдХреНрд╕реА рд╕реНрд░реЛрддрд╣рд░реВрдХреЛ рд╡реЗрдм рд╕рдХреЗрдЯрд╣рд░реВрдорд╛ рдкреНрд░рдорд╛рдгрдкрддреНрд░рд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди (рддреНрдпрд╣рд╛рдБ рдХреБрдиреИ рдкрдирд┐ рд╣реБрдиреЗ рдЫреИрди рднрдиреЗрд░ рдерд╛рд╣рд╛ рдкрд╛рдПрд░) рдпрд╕реНрддреЛ рдЕрдкрд╡рд╛рдж рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫред

2 рд╕рдорд╛рдзрд╛рди рдпрд╣рд╛рдБ рдлреЗрд▓рд╛ рдкрд░реНрдпреЛ:

рдХ) рд╕реНрддрд░рдорд╛

<Location sock*> SSLVerifyClient optional </Location>
<Location /> SSLVerifyClient require </Location>

рдкрд╣реБрдБрдЪ рд╕реНрддрд░ рдкрд░рд┐рд╡рд░реНрддрди рдЧрд░реНрдиреБрд╣реЛрд╕реНред

рдпреЛ рд╡рд┐рдзрд┐ рдирд┐рдореНрди nuances рдЫ:

  • рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рдорд╛рдгрд┐рдХрд░рдг рдкреНрд░реЛрдХреНрд╕реА рдЧрд░рд┐рдПрдХреЛ рд╕реНрд░реЛрддрдорд╛ рдЕрдиреБрд░реЛрдз рдкрдЫрд┐ рд╣реБрдиреНрдЫ, рддреНрдпреЛ рд╣реЛ, рдкреЛрд╕реНрдЯ рдЕрдиреБрд░реЛрдз рд╣реНрдпрд╛рдиреНрдбрд╢реЗрдХред рдпрд╕рдХреЛ рдорддрд▓рдм рдкреНрд░реЛрдХреНрд╕реА рдкрд╣рд┐рд▓реЗ рд▓реЛрдб рд╣реБрдиреЗрдЫ рд░ рддреНрдпрд╕рдкрдЫрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рд╕реЗрд╡рд╛рдорд╛ рдЕрдиреБрд░реЛрдз рдХрд╛рдЯрд┐рдиреЗрдЫред рдпреЛ рдЦрд░рд╛рдм рдЫ, рддрд░ рдЖрд▓реЛрдЪрдирд╛рддреНрдордХ рдЫреИрди;
  • ╨Т ╨┐╤А╨╛╤В╨╛╨║╨╛╨╗╨╡ http2. ╨Ю╨╜ ╨╡╤Й╤С ╨╜╨░╤Е╨╛╨┤╨╕╤В╤Б╤П ╨▓ draft-╨╡, ╨╕ ╨┐╤А╨╛╨╕╨╖╨▓╨╛╨┤╨╕╤В╨╡╨╗╨╕ ╨▒╤А╨░╤Г╨╖╨╡╤А╨╛╨▓ ╨╜╨╡ ╨╖╨╜╨░╤О╤В, ╨║╨░╨║ ╨╡╨│╨╛ ╤А╨╡╨░╨╗╨╕╨╖╨╛╨▓╨░╤В╤М #info about tls1.3 http2 post handshake (not working now) RFC 8740 "HTTP/1.3 рд╕рдБрдЧ TLS 2 рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ" рд▓рд╛рдЧреВ рдЧрд░реНрдиреБрд╣реЛрд╕реН;
  • рдпреЛ рдкреНрд░рд╢реЛрдзрди рдХрд╕рд░реА рдПрдХреАрдХрд░рдг рдЧрд░реНрдиреЗ рд╕реНрдкрд╖реНрдЯ рдЫреИрдиред

рдЦ) рдЖрдзрд╛рд░рднреВрдд рд╕реНрддрд░рдорд╛, рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдмрд┐рдирд╛ 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"

рдердк рд╡рд┐рд╕реНрддреГрдд рдЬрд╛рдирдХрд╛рд░реА ssl рдХреЛ рдмрд╛рд░реЗ рдорд╛ рд▓реЗрдЦ рдорд╛ рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ: Apache рд╕рд░реНрднрд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдкреНрд░рдорд╛рдгреАрдХрд░рдг

рджреБрдмреИ рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░рд┐рдПрдХрд╛ рдерд┐рдП, рд╡рд┐рдХрд▓реНрдк "b" рдпрд╕рдХреЛ рдмрд╣реБрдореБрдЦреА рдкреНрд░рддрд┐рднрд╛ рд░ http2 рдкреНрд░реЛрдЯреЛрдХрд▓рд╕рдБрдЧ рдЕрдиреБрдХреВрд▓рддрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдЫрдиреЛрдЯ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛред

рдпрд╕ рдкрд░рд┐рдХрд▓реНрдкрдирд╛рдХреЛ рдкреНрд░рдорд╛рдгреАрдХрд░рдг рдкреВрд░рд╛ рдЧрд░реНрди, рдпрд╕рд▓реЗ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдХреЛ рд╕рд╛рде рдзреЗрд░реИ рдкреНрд░рдпреЛрдЧрд╣рд░реВ рд▓рд┐рдпреЛ; рдирд┐рдореНрди рдбрд┐рдЬрд╛рдЗрдирд╣рд░реВ рдкрд░реАрдХреНрд╖рдг рдЧрд░рд┐рдпреЛ:

рдпрджрд┐ = рдЖрд╡рд╢реНрдпрдХ = рдкреБрди: рд▓реЗрдЦреНрдиреБрд╣реЛрд╕реН

рдкрд░рд┐рдгрд╛рдо рдирд┐рдореНрди рдЖрдзрд╛рд░рднреВрдд рдбрд┐рдЬрд╛рдЗрди рд╣реЛ:

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 рдХреЛ рд╕рдЯреНрдЯрд╛) рдХреЛ рд░реВрдкрдорд╛ рдПрдХ рдЧреИрд░-рдЕрд╕реНрддрд┐рддреНрд╡ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рдорд╛рд▓рд┐рдХ рдердкреНрдиреБрдкрд░реНтАНрдпреЛ, рдХрд╛рдЧрдЬрд╛рддрдорд╛ рдердк рд╡рд┐рд╡рд░рдгрд╣рд░реВ:

Apache Module mod_ssl

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

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. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░рд╣рд░реВ рдПрдХ рдкреНрд░реЛрдХреНрд╕реА рд╡реЗрдм рд╕рд░реНрднрд░ (рдХреЗрд╡рд▓ рдирд┐рд░реНрдорд┐рдд рдореЛрдбреНрдпреБрд▓ рд░ рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ) рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рдЬрд╕рд░реА рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рдкрддреНрддрд╛ рд▓рдЧрд╛рдпреМрдВ, Apache рд╕рдБрдЧ рдзреЗрд░реИ рдХреЛрд░ рдХрд╛рд░реНрдпрдХреНрд╖рдорддрд╛ рдЫ рдЬрд╕рд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╕рд╢рд░реНрдд рдирд┐рд░реНрдорд╛рдгрд╣рд░реВ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред рдпрджреНрдпрдкрд┐, рд╣рд╛рдореАрд▓рд╛рдИ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдмреНрд░рд╛рдЙрдЬрд░рдорд╛ рд╣реБрдБрджрд╛ рд╣рд╛рдореНрд░реЛ рдЬрд╛рдирдХрд╛рд░реАрд▓рд╛рдИ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрди рд╕рд╛рдзрди рдЪрд╛рд╣рд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓реЗ рдХреЗ рднрдгреНрдбрд╛рд░ рдЧрд░реНрдиреЗ рд░ рдХрд┐рди, рд░ рдХреБрди рдЕрдиреНрддрд░реНрдирд┐рд╣рд┐рдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ рднрдиреЗрд░ рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдЫреМрдВ:

  • рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдЯреЛрдХрди рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬреБрди рд╕рдЬрд┐рд▓реИ рдбрд┐рдХреЛрдб рдЧрд░реНрди рд╕рдХрд┐рдБрджреИрдиред
  • рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдЯреЛрдХрди рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬреБрди рдпрд╕рдорд╛ рдирд┐рд░реНрдорд┐рдд рдЕрдкреНрд░рдЪрд▓рд┐рдд рдЫ рд░ рд╕рд░реНрднрд░рдорд╛ рдЕрдкреНрд░рдЪрд▓рд┐рддрддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрдиреЗ рдХреНрд╖рдорддрд╛ рдЫред
  • рд╣рд╛рдореАрд▓рд╛рдИ рдПрдЙрдЯрд╛ рдЯреЛрдХрди рдЪрд╛рд╣рд┐рдиреНрдЫ рдЬреБрди рдкреНрд░рдорд╛рдгрдкрддреНрд░рдХреЛ рдорд╛рд▓рд┐рдХрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рд╣реБрдиреЗрдЫред

рдпрд╕рдХрд╛ рд▓рд╛рдЧрд┐ рд╣реНрдпрд╛рд╕рд┐рдЩ рдкреНрд░рдХрд╛рд░реНрдп, рдиреБрди, рд░ рдЯреЛрдХрдирдХреЛ рдЙрдореЗрд░рдорд╛ рдорд┐рддрд┐ рдЪрд╛рд╣рд┐рдиреНрдЫред рдХрд╛рдЧрдЬрд╛рддрдХреЛ рдЖрдзрд╛рд░рдорд╛ Apache HTTP рд╕рд░реНрднрд░рдорд╛ рдЕрднрд┐рд╡реНрдпрдХреНрддрд┐рд╣рд░реВ рд╣рд╛рдореАрд╕рдБрдЧ рдпреЛ рд╕рдмреИ рдмрд╛рдХрд╕ sha1 рд░ %{TIME} рдмрд╛рд╣рд┐рд░ рдЫред

рдкрд░рд┐рдгрд╛рдо рдпреЛ рдбрд┐рдЬрд╛рдЗрди рдерд┐рдпреЛ:

#╨╜╨╡╤В ╤Б╨╡╤А╤В╨╕╤Д╨╕╨║╨░╤В╨░, ╨╕ ╨╛╨▒╤А╨░╤Й╨╡╨╜╨╕╨╡ ╨║ 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>

рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рднрдПрдХреЛ рдЫ, рддрд░ рддреНрдпрд╣рд╛рдБ рд╕рд░реНрднрд░ рдЕрдкреНрд░рдЪрд▓рд┐рдд рд╣реБрдиреЗ рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреН (рддрдкрд╛рдИрд▓реЗ рдПрдХ рд╡рд░реНрд╖ рдкреБрд░рд╛рдиреЛ рдХреБрдХреА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ), рдЬрд╕рдХреЛ рдорддрд▓рдм рдЯреЛрдХрдирд╣рд░реВ, рдЖрдиреНрддрд░рд┐рдХ рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рд╕реБрд░рдХреНрд╖рд┐рдд рднрдП рдкрдирд┐, рдФрджреНрдпреЛрдЧрд┐рдХ (рдмреГрд╣рддреН) рдкреНрд░рдпреЛрдЧрдХреЛ рд▓рд╛рдЧрд┐ рдЕрд╕реБрд░рдХреНрд╖рд┐рдд рдЫрдиреНред

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

4. рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрдирд╣рд░реВ рдкрд╣рд┐рд▓реЗ рдиреИ рддрдпрд╛рд░-рдирд┐рд░реНрдорд┐рдд Apache рдореЛрдбреНрдпреБрд▓рд╣рд░реВрдХреЛ рд░реВрдкрдорд╛ рд▓рд╛рдЧреВ рдЧрд░рд┐рдПрдХреЛ рдЫред

рдПрдЙрдЯрд╛ рдорд╣рддреНрддреНрд╡рдкреВрд░реНрдг рд╕рдорд╕реНрдпрд╛ рдЕрдШрд┐рд▓реНрд▓реЛ рдкреБрдирд░рд╛рд╡реГрддреНрддрд┐рдмрд╛рдЯ рд░рд╣реНрдпреЛ - рдЯреЛрдХрди рдмреБрдвреНрдпреМрд▓реА рдирд┐рдпрдиреНрддреНрд░рдг рдЧрд░реНрди рдЕрд╕рдХреНрд╖рдорддрд╛ред

рд╣рд╛рдореА рдПрдХ рддрдпрд╛рд░ рдореЛрдбреНрдпреБрд▓ рдЦреЛрдЬреНрджреИрдЫреМрдВ рдЬрд╕рд▓реЗ рдпреЛ рдЧрд░реНрдЫ, рд╢рдмреНрджрд╣рд░реВ рдЕрдиреБрд╕рд╛рд░: apache token json two factor auth

рд╣реЛ, рддреНрдпрд╣рд╛рдБ рддрдпрд╛рд░ рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдЫрдиреН, рддрд░ рддреА рд╕рдмреИ рд╡рд┐рд╢рд┐рд╖реНрдЯ рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдмрд╛рдБрдзрд┐рдПрдХрд╛ рдЫрдиреН рд░ рд╕рддреНрд░ рд░ рдЕрддрд┐рд░рд┐рдХреНрдд рдХреБрдХреАрд╣рд░реВ рд╕реБрд░реБ рдЧрд░реНрдиреЗ рд░реВрдкрдорд╛ рдХрд▓рд╛рдХреГрддрд┐рд╣рд░реВ рдЫрдиреНред рдЕрд░реНрдерд╛рддреН рдХреЗрд╣реА рд╕рдордпрдХреЛ рд▓рд╛рдЧрд┐ рд╣реЛрдЗрди ред
рд╣рд╛рдореАрд▓рд╛рдИ рдЦреЛрдЬреНрди рдкрд╛рдБрдЪ рдШрдгреНрдЯрд╛ рд▓рд╛рдЧреНрдпреЛ, рдЬрд╕рд▓реЗ рдареЛрд╕ рдкрд░рд┐рдгрд╛рдо рджрд┐рди рд╕рдХреЗрдиред

5. рддрд╛рд░реНрдХрд┐рдХ рд░реВрдкрдорд╛ рдЕрдиреНрддрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд╕рдВрд░рдЪрдирд╛ рдбрд┐рдЬрд╛рдЗрди рдЧрд░реЗрд░ рдЕрд╕реНрдерд╛рдпреА рд╕рддреНрд░ рдЯреЛрдХрдирд╣рд░реВ рд▓рд╛рдЧреВ рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫред

рд░реЗрдбрд┐рдореЗрдб рдореЛрдбреНрдпреБрд▓рд╣рд░реВ рдзреЗрд░реИ рдЬрдЯрд┐рд▓ рдЫрдиреН, рдХрд┐рдирднрдиреЗ рд╣рд╛рдореАрд▓рд╛рдИ рдХреЗрд╡рд▓ рдХреЗрд╣реА рдХрд╛рд░реНрдпрд╣рд░реВ рдЪрд╛рд╣рд┐рдиреНрдЫред

рдпрд╕реЛ рднрдирд┐рдПрдХреЛ рдЫ, рдорд┐рддрд┐рдХреЛ рд╕рд╛рде рд╕рдорд╕реНрдпрд╛ рдпреЛ рд╣реЛ рдХрд┐ Apache рдХреЛ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрд▓реЗ рднрд╡рд┐рд╖реНрдпрдмрд╛рдЯ рдорд┐рддрд┐ рдЙрддреНрдкрдиреНрди рдЧрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдБрджреИрди, рд░ рдЕрдкреНрд░рдЪрд▓рд┐рддрддрд╛ рдЬрд╛рдБрдЪ рдЧрд░реНрджрд╛ рдирд┐рд░реНрдорд┐рдд рдкреНрд░рдХрд╛рд░реНрдпрд╣рд░реВрдорд╛ рдХреБрдиреИ рдЧрдгрд┐рддреАрдп рдЬреЛрдб/рдШрдЯрд╛рдЙ рд╣реБрдБрджреИрдиред

рддреНрдпреЛ рд╣реЛ, рддрдкрд╛рдИрд▓реЗ рд▓реЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреНрди:

(%{env:zt-cert-date} + 30) > %{DATE}

рддрдкрд╛рдИрдВ рдХреЗрд╡рд▓ рджреБрдИ рд╕рдВрдЦреНрдпрд╛рд╣рд░реВ рддреБрд▓рдирд╛ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

╨Я╤А╨╕ ╨┐╨╛╨╕╤Б╨║╨╡ ╨╛╨▒╤Е╨╛╨┤╨░ ╨┐╤А╨╛╨▒╨╗╨╡╨╝╤Л Safari ╨╜╨░╤И╨╗╨░╤Б╤М ╨╕╨╜╤В╨╡╤А╨╡╤Б╨╜╨░╤П ╤Б╤В╨░╤В╤М╤П: рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрдХреЛ рд╕рд╛рде рдЧреГрд╣ рд╕рд╣рд╛рдпрдХ рд╕реБрд░рдХреНрд╖рд┐рдд рдЧрд░реНрджреИ (Safari/iOS рд╕рдБрдЧ рдХрд╛рдо рдЧрд░реНрджрдЫ)
рдпрд╕рд▓реЗ Nginx рдХреЛ рд▓рд╛рдЧреА Lua рдорд╛ рдХреЛрдб рдХреЛ рдПрдХ рдЙрджрд╛рд╣рд░рдг рдХреЛ рд╡рд░реНрдгрди рдЧрд░реНрджрдЫ, рд░ рдЬреБрди, рдпреЛ рдмрд╛рд╣рд┐рд░ рдирд┐рд╕реНрдХрд┐рдпреЛ, рдзреЗрд░реИ рдзреЗрд░реИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдХреЛ рддреНрдпреЛ рднрд╛рдЧ рдХреЛ рддрд░реНрдХ рджреЛрд╣реЛрд░реНрдпрд╛рдЙрдБрдЫ рдЬреБрди рд╣рд╛рдореАрд▓реЗ рдкрд╣рд┐рд▓реЗ рдиреИ рд▓рд╛рдЧреВ рдЧрд░рд┐рд╕рдХреЗрдХрд╛ рдЫреМрдВ, рд╣реНрдпрд╛рд╕рд┐рдВрдЧ рдХреЛ рд▓рд╛рдЧреА hmac рд╕рд╛рд▓реНрдЯрд┐рдЩ рд╡рд┐рдзрд┐ рдХреЛ рдкреНрд░рдпреЛрдЧ рдХреЛ рдЕрдкрд╡рд╛рдж рдХреЛ рд╕рд╛рде (ред рдпреЛ Apache рдорд╛ рдлреЗрд▓рд╛ рдкрд░реЗрди)ред

рдпреЛ рд╕реНрдкрд╖реНрдЯ рднрдпреЛ рдХрд┐ рд▓реБрдЖ рд╕реНрдкрд╖реНрдЯ рддрд░реНрдХ рд╕рдВрдЧ рдПрдХ рднрд╛рд╖рд╛ рд╣реЛ, рд░ рдпреЛ Apache рдХреЛ рд▓рд╛рдЧреА рдХреЗрд╣рд┐ рд╕рд░рд▓ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ:

Nginx рд░ Apache рдХреЛ рд╕рд╛рде рднрд┐рдиреНрдирддрд╛ рдЕрдзреНрдпрдпрди рдЧрд░реНрджреИ:

рд░ рд▓реБрдЖ рднрд╛рд╖рд╛ рдирд┐рд░реНрдорд╛рддрд╛рдмрд╛рдЯ рдЙрдкрд▓рдмреНрдз рдХрд╛рд░реНрдпрд╣рд░реВ:
22.1 - рдорд┐рддрд┐ рд░ рд╕рдордп

рд╣рд╛рдореАрд▓реЗ рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рд▓реБрдЖ рдлрд╛рдЗрд▓рдорд╛ 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 рдмрд╛рдЯ рдпрд╕ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЖрдзрд╛рд░рдорд╛ рдкрд╣реБрдБрдЪ рдЬрд╛рдБрдЪрд╣рд░реВ рдкрдЫрд┐ рдорд╛рддреНрд░ рд╕рдХреНрд░рд┐рдп рд╣реБрдиреЗрдЫред

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

рд╕реНрд░реЛрддрдХреЛ рд▓рд┐рдЩреНрдХ рдЫрд╡рд┐рд╣рд░реВ.

рдЕрд░реНрдХреЛ рдХреБрд░рд╛ред

рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛, рдпрд╕рд▓реЗ рдлрд░рдХ рдкрд░реНрджреИрди рдХрд┐ рдирд┐рд░реНрджреЗрд╢рдирд╣рд░реВ Apache (рд╕рд╛рдпрдж Nginx рдкрдирд┐) рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдХреБрди рдХреНрд░рдордорд╛ рд▓реЗрдЦрд┐рдПрдХреЛ рдЫ, рдХрд┐рдирдХрд┐ рдЕрдиреНрддрдорд╛ рд╕рдмреИ рдХреБрд░рд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рдХреЛ рдЕрдиреБрд░реЛрдзрдХреЛ рдХреНрд░рдордорд╛ рдХреНрд░рдордмрджреНрдз рд╣реБрдиреЗрдЫ, рдЬреБрди рдкреНрд░рдХреНрд░рд┐рдпрд╛рдХреЛ рд▓рд╛рдЧрд┐ рдпреЛрдЬрдирд╛рд╕рдБрдЧ рдореЗрд▓ рдЦрд╛рдиреНрдЫред рд▓реБрдЖ рд▓рд┐рдкрд┐рд╣рд░реВред

рд╕рдорд╛рдкрди:

рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рдкрдЫрд┐ рджреЗрдЦрд┐рдиреЗ рдЕрд╡рд╕реНрдерд╛ (рд▓рдХреНрд╖реНрдп):
рд╕реЗрд╡рд╛рд╣рд░реВ рд░ рдкреВрд░реНрд╡рд╛рдзрд╛рд░рд╣рд░реВрдХреЛ рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдореЛрдмрд╛рдЗрд▓ рдлреЛрдирдмрд╛рдЯ рдЖрдИрдУрдПрд╕рдорд╛ рдЕрддрд┐рд░рд┐рдХреНрдд рдХрд╛рд░реНрдпрдХреНрд░рдорд╣рд░реВ (VPN) рдмрд┐рдирд╛ рдЙрдкрд▓рдмреНрдз рдЫ, рдПрдХреАрдХреГрдд рд░ рд╕реБрд░рдХреНрд╖рд┐рддред

рд▓рдХреНрд╖реНрдп рд╣рд╛рд╕рд┐рд▓ рднрдПрдХреЛ рдЫ, рд╡реЗрдм рд╕рдХреЗрдЯ рдХрд╛рдо рдЧрд░реНрджрдЫ рд░ рд╕реБрд░рдХреНрд╖рд╛ рдХреЛ рд╕реНрддрд░ рдПрдХ рдкреНрд░рдорд╛рдгрдкрддреНрд░ рднрдиреНрджрд╛ рдХрдо рдЫреИрдиред

рд╣рд╛рдореАрд▓реЗ ZeroTech рдорд╛ рдХрд╕рд░реА Apple Safari рд░ рдХреНрд▓рд╛рдЗрдиреНрдЯ рд╕рд░реНрдЯрд┐рдлрд┐рдХреЗрдЯрд╣рд░реВ рд╡реЗрдмрд╕рдХреЗрдЯрд╣рд░реВрд╕рдБрдЧ рдЬрдбрд╛рди рдЧрд░реНрдпреМрдВ

рд╕реНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди