Замена сертификата в зеркале

В предыдущей статье я привел инструкцию для настройки зеркала для MS SQL в недоменной среде.Но я там указал срок действия сертификата на год, т.е. через год надо было бы его заменить, а чтоб не проморгать этот момент, надо было бы прикрутить мониторинг и все такое. Поэтому решили этот вопрос проще, установкой сразу нового серта с большим сроком действия. В плане безопасности это конечно не очень, ну и ладно, пускай прорываются через все фаерволы и дмз, перехватывают серт трафика синхронизации и расшифровывают его :)

Итак:

Смотрим название сертификата, используемого для зеркала

SELECT e.name [endpoint_name], c.name [cert_name], c.start_date, c.expiry_date
FROM sys.database_mirroring_endpoints e
INNER JOIN sys.certificates c
ON e.certificate_id=c.certificate_id

Смотрим логины с сертификатами, которые используются для зеркала

SELECT
sp.name AS [login_name],
e.name AS [endpoint_name],
c.name AS [cert_name],
c.start_date,
c.expiry_date
FROM
sys.server_permissions AS prmssn
INNER JOIN sys.endpoints AS e
ON e.endpoint_id = prmssn.major_id
and prmssn.class = 105
INNER JOIN sys.server_principals AS sp
ON sp.principal_id = prmssn.grantee_principal_id
INNER JOIN sys.database_principals AS dp
ON sp.sid=dp.sid
INNER JOIN sys.certificates c
ON dp.principal_id=c.principal_id
WHERE e.type=4

Теперь, зная все данные, можно приступать к манипуляциям

*1. Создаем сертификат для точки подключения на принципале

USE master;
CREATE CERTIFICATE [сервер1_mirroring_cert]
WITH SUBJECT = 'сервер1_mirroring_cert',
EXPIRY_DATE='01/01/2025'; -- ставим на столько лет, сколько нам надо
GO

*2. Сразу же делаем бэкап, копируем на партнера и на витнес

BACKUP CERTIFICATE [сервер1_mirroring_cert] TO FILE = 'путь_до_сертификата_сервер1_new.cer';
GO

*3. Заменяем сертификат

ALTER ENDPOINT Endpoint_Mirroring
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE [сервер1_mirroring_cert]);
GO

*4. Ну и удаляем старый сертификат

DROP CERTIFICATE старый_сертификат;
GO

*5. Переходим на партнера, удаляем серт, который использовался для логина с принципала

DROP CERTIFICATE сервер1;
GO

*6. Создаем новый сертификат, используя сертификат с принципала

CREATE CERTIFICATE [сервер1_mirroring_cert] AUTHORIZATION сервер1_user
FROM FILE = 'путь_до_сертификата_сервер1_new.cer';
GO

*7. Создаем новый сертфикат для точки подключения на партнере

USE master;
CREATE CERTIFICATE [сервер2_mirroring_cert]
WITH SUBJECT = 'сервер2_mirroring_cert',
EXPIRY_DATE='02/01/2025'; -- тоже ставим достаточное количество лет
GO

*8. Делаем бэкап сертификата, копируем его на принципала и на витнес

BACKUP CERTIFICATE [сервер2_mirroring_cert] TO FILE = 'путь_до_сертификата_сервер2_new.cer';
GO

*9. Указываем точке подключения использовать новый сертификат

ALTER ENDPOINT Endpoint_Mirroring
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE [CAUISDB2_mirroring_cert]);
GO

*10. Удаляем старый сертификат

DROP CERTIFICATE сервер2
GO

*11. Создаем сертифика, испольуя предыдущий бэкап

CREATE CERTIFICATE [сервер2_mirroring_cert] AUTHORIZATION сервер2_user
FROM FILE = 'путь_до_сертификата_сервер2_new.cer'
GO

*12. Переходим на витнес

USE master;
CREATE CERTIFICATE [витнес_mirroring_cert]
WITH SUBJECT = 'витнес_mirroring_cert',
EXPIRY_DATE='03/01/2025'; --опять лета и годы :)
GO

*13. Делаем бэкапа и копируем по остальным серверам

BACKUP CERTIFICATE [витнес_mirroring_cert] TO FILE = 'путь_до_сертификата_витнес_new.cer';
GO

*14. Заменяем серт

ALTER ENDPOINT Endpoint_Mirroring
FOR DATABASE_MIRRORING (AUTHENTICATION = CERTIFICATE [витнес_mirroring_cert])
GO

*15. Удаляем старый серт

DROP CERTIFICATE витнес
GO

*16. Идем на приципал, делаем серт

CREATE CERTIFICATE [витнес_mirroring_cert] AUTHORIZATION витнес_user
FROM FILE = 'путь_до_сертификата_витнес_new.cer'
GO

*17. Удаляем старый серт

DROP CERTIFICATE CAUISMTS
GO

*18. Идем на зеркало и делаем ту же самую операцию

CREATE CERTIFICATE [витнес_mirroring_cert] AUTHORIZATION витнес_user
FROM FILE = 'путь_до_сертификата_витнес_new.cer'
GO
DROP CERTIFICATE витнес
GO

*19. Идем на витнес и опять делаем все тоже самое

CREATE CERTIFICATE [сервер2_mirroring_cert] AUTHORIZATION сервер_user
FROM FILE = 'путь_до_сертификата_сервер2_new.cer'
GO
CREATE CERTIFICATE [сервер1_mirroring_cert] AUTHORIZATION сервер1_user
FROM FILE = 'путь_до_сертификата_сервер1_new.cer'
GO
DROP CERTIFICATE сервер1
DROP CERTIFICATE сервер2
GO

Ну вот на этом все.