2017-11-15 61 views
2

Visual Studio (VS) 2015에서 2 개의 DLL로 서명했습니다. 이전 직원이 비대칭 키를 만들고 로그인했는데 UNSAFE 모드에서 어셈블리 중 하나를 올바르게 실행했습니다.안전하지 않은 어셈블리에 대해 SQL Server 2014에서 비대칭 키 생성

나는 두 번째로 다음과 같은 오류가 발생합니다 :

메시지 10327, 수준 14, 상태 1, 줄 27
조립을위한 'TableFile을'어셈블리를 만들 실패 어셈블리 'TableFile가'승인되지 않기 때문에 PERMISSION_SET = UNSAFE. 데이터베이스 소유자 (DBO)에 UNSAFE ASSEMBLY 사용 권한이 있고 데이터베이스에 TRUSTWORTHY 데이터베이스 속성이있는 경우 어셈블리에 권한이 부여됩니다. 또는 어셈블리가 UNSAFE ASSEMBLY 권한이있는 해당 로그인이있는 인증서 또는 비대칭 키로 서명 된 경우.

나는 이전 직원에게이 작업을 수행하는 방법을 어떻게 알 수 있습니까? 나도이 시도 : 이것은 다음과 같은 오류가 제공

USE master; 
GO 

CREATE ASYMMETRIC KEY AProjectKey FROM EXECUTABLE FILE = 'E:\sqldlls\TableFile.dll' 
CREATE LOGIN AProjectLogin FROM ASYMMETRIC KEY AProjectKey ; 
GRANT UNSAFE ASSEMBLY TO AProjectLogin ; 
GO 

: 이름을 가진 9
비대칭 키를 메시지 15396, 수준 16, 상태 1, 줄

을 'AProjectKey'이미 존재하거나 비대칭 키가 이미 데이터베이스에 추가되었습니다.

메시지 수준 15151, 수준 16, 상태 1, 줄 10
비대칭 키 'AProjectKey'가 없거나 사용 권한이 없기 때문에 찾을 수 없습니다.

메시지 레벨 15151, 레벨 16, 상태 1, 줄 11
'AProjectLogin'이 (가) 없거나 권한이 없기 때문에 'AProjectLogin'로그인을 찾을 수 없습니다.

이 어셈블리를 안전하지 않은 모드에서 실행하려면 어떻게해야합니까? 미리 감사드립니다. 그 3 오류 메시지에 대해서는

답변

1

:

  1. 첫 번째 인해 비대칭 키가 이미 존재 일 수 있지만, 다른 이름으로 할 수있다. 키와 인증서는 이름 만이 아닌 공개 키의 관점에서 고유해야합니다 (분명히 고유해야 함). 각 키와 인증서에는 "지문"이라고하는 공개 키의 해시가 있습니다. 기존 키/인증서의 지문은 새 키/인증서를 만들 때 검사되며 엄지 손가락이 이미있는 경우 이름이 다른 키/인증서의 생성을 방지합니다. 이것이 "또는이 비대칭 키가 이미 데이터베이스에 추가되었습니다"라는 오류 메시지의 의미입니다.

    OR :

    그것은하지만 이름 AProjectKey

  2. 와 다른 비대칭 키 (즉, 다른 "지문")는 master에 존재 함을 의미 할 수 있었다 당신은 다른에서 동일한 키를 만들 수 없습니다 때문에 이름에 비동기 키가 없으므로이 이름을 사용하여 로그인을 만들 수 없습니다 (다시 말해서 CREATE ASYMMETRIC KEY 문이 실패했기 때문에).
  3. 로그인을 만들 수 없으므로 권한이 부여되지 않습니다.

오류 # 2는 문제의 범위를 좁히는 데 도움이됩니다. 오류 # 1이 이름이 같지만 다른 "지문"이있는 기존의 비대칭 키로 인해 발생하면 로그인을 만들 수 있었을 것입니다 (아직 존재하지 않았 으면). 그렇지 않으면 오류가 발생했을 것입니다 로그인 (즉, "서버 원칙")이 이미 존재합니다. 그러나 오류는 해당 비대칭 키 이름이 인 것을 발견 할 수 없습니다. 이것은 비대칭 키 자체가 이미 존재하지만 다른 이름으로 존재 함을 의미합니다. 당신은 실행하여 비대칭 키가 생성 된 것을 볼 수 있습니다 다음

SELECT * FROM sys.asymmetric_keys; 

그러나 그 회의에서 나온 (또는 총회가이 일에 서명하는 데 사용 된 것과 같은 강력한 이름 키로 서명하는 일을 알려하지 않습니다). 이를 위해서는 "지문"을 알아야하며, 명령 프롬프트를 열어야합니다 (Visual Studio가 설치 될 때 "개발자 명령 프롬프트"를 열어야합니다. 설치시 올바른 경로가 설정되어 있어야 함).

CD /D E:\sqldlls\ 
sn -T TableFile.dll 

당신은 볼 수 :

Public key token is XXXXXXXXXXXXXXXX 

복사하고 다음 쿼리에 XXXXX "토큰"(즉, 지문) 것을 붙여 : 그런 다음 실행

SELECT ak.[name], ak.[sid] 
FROM sys.asymmetric_keys ak 
WHERE ak.[thumbprint] = 0x{XXXXXXXXXXXXXXXX}; -- remove the { and } 

가 있다고 가정 행이 반환되면 로그인이 있는지 확인해야합니다. 비대칭 키에서 로그인을 만들려고하면 키/인증서별로 로그인을 하나만 만들 수 있기 때문에 로그인 이름이 나타나지 않습니다. 오류 메시지는 생성하려는 이름 만보고합니다. 동일한 키에 대해 다른 이름 이어도 이미 존재하는 키입니다. 그래서, 반환 된 행에서 SID를 가지고 다음 쿼리에 붙여 넣습니다 : 더 행이 반환되지 않습니다

SELECT sp.* 
FROM sys.server_principals sp 
WHERE sp.[sid] = 0x{SID_from_sys_asymmetric_keys}; -- remove the { and } 

경우에 당신은 비대칭 키 그에서 로그인을 만들어야합니다.

이 시점에서 로그인이 있어야하므로 UNSAFE ASSEMBLY 권한을 부여하십시오.

이제 어셈블리를 다시 만들어보십시오.

+0

내 문제가 완전히 수정되었습니다. – cdub

+0

@cdub 굉장! 로그인이 누락 되었습니까, 아니면 로그인 했습니까? –

+0

로그인이 있었는데 허가가 필요했습니다. – cdub