共用方式為


PROPID_M_SIGNATURE

 

Applies To: Windows 10, Windows 7, Windows 8, Windows 8.1, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012 R2, Windows Server Technical Preview, Windows Vista

The PROPID_M_SIGNATURE property specifies the MSMQ 1.0 signature or application-generated signature that is attached to the message.

Property ID

PROPID_M_SIGNATURE

Type Indicator

VT_VECTOR | VT_UI1

MQPROPVARIANT Field

caub

Property Value

Digital signature.

Remarks

In most cases, this property is set by the Message Queuing runtime when the sending application requests authentication. This property can also be set by connector applications sending messages to Message Queuing. In these cases, the receiving application can use this property to retrieve the MSMQ 1.0 or application-generated signature attached to the message.

Note

This property contains an MSMQ 1.0 signature only if the sending application specified an MSMQ 1.0 signature when requesting authentication.

Connector applications may also set this property when they call MQSendMessage. However, when a connector application sets this property, Message Queuing does not generate a digital signature for this property. The connector application must generate the digital signature itself based on the certificate of the user sending the message.

When connector applications set PROPID_M_SIGNATURE, the PROPID_M_CONNECTOR_TYPE property must also be set so that Message Queuing does not generate a digital signature. PROPID_M_SIGNATURE is ignored if PROPID_M_CONNECTOR_TYPE is not also set when the message is sent.

Setting the Digital Signature

To set the digital signature, the connector application must specify PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN in the MQMSGPROPS structure and call MQSendMessage.

Retrieving the Digital Signature

To retrieve the digital signature, specify PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN in the MQMSGPROPS structure. Then call MQReceiveMessage or MQReceiveMessageByLookupId and examine the returned value.

If MQReceiveMessage or MQReceiveMessageByLookupId fails, returning an MQ_ERROR_SIGNATURE_BUFFER_OVERFLOW error, use the returned value of PROPID_M_SIGNATURE_LEN to reallocate the message body buffer and call the applicable function again.

Before using the retrieved digital signature, always check the length property PROPID_M_SIGNATURE_LEN to see whether the digital signature was sent in this property with the message. If the returned value of PROPID_M_SIGNATURE_LEN is 0, no signature was sent in this property with the message. If the returned value is non-0, PROPID_M_SIGNATURE contains a digital signature.

Note

If the sending application sent an MSMQ 2.0 signature, but did not attach an MSMQ 1.0 signature, this property will contain a buffer of 4 zeroed bytes.

Equivalent COM Property

With COM components, the equivalent property for setting and retrieving the MSMQ 1.0 or application-generated signature attached to the message is MSMQMessage.Signature.

For information on See
How Message Queuing creates digital signatures How Message Queuing Authenticates Messages
MSMQ 1.0 signatures Digital Signatures
Authenticating messages sent by a connector application Connector Application Security

Example Code

The following code fragments show how PROPID_M_SIGNATURE and PROPID_M_SIGNATURE_LEN are specified in arrays that can be used to initialize an MQMSGPROPS structure for attaching and retrieving a digital signature.

To Attach the Digital Signature

aMsgPropId[i] = PROPID_M_SIGNATURE;                       // Property ID  
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;                   // Type indicator  
aMsgPropVar[i].caub.pElems = (LPBYTE)Signature;  
aMsgPropVar[i].caub.cElems = sizeof(Signature);  
i++;  

To Retrieve the Digital Signature

ULONG ulSignatureBufferSize = 1024;  
UCHAR * pucSignatureBuffer = NULL;  
pucSignatureBuffer = (UCHAR *)malloc(ulSignatureBufferSize);  
if (pucSignatureBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucSignatureBuffer, 0, ulSignatureBufferSize);  
aMsgPropID[i] = PROPID_M_SIGNATURE;                       // Property ID  
aMsgPropVar[i].vt = VT_VECTOR | VT_UI1;                   // Type indicator  
aMsgPropVar[i].caub.pElems = (UCHAR*)pucSignatureBuffer;  
aMsgPropVar[i].caub.cElems = ulSignatureBufferSize;  
i++  
  
aMsgPropId[i] = PROPID_M_SIGNATURE_LEN;                   // Property ID  
aMsgPropVar[i].vt = VT_UI4;                               // Type indicator  
i++;  
  
// Reallocate memory for the Signature buffer if necessary.  
ulSignatureBufferSize = aMsgPropVar[1].ulVal*sizeof(UCHAR);  
pucSignatureBuffer = (UCHAR*)realloc(pucSignatureBuffer, ulSignatureBufferSize);  
if (pucSignatureBuffer == NULL)  
{  
  return MQ_ERROR_INSUFFICIENT_RESOURCES;  
}  
memset(pucSignatureBuffer, 0, ulSignatureBufferSize);  
aMsgPropVar[0].caub.pElems = (UCHAR*)pucSignatureBuffer;  // Pointer to the new buffer  
aMsgPropVar[0].caub.cElems = ulSignatureBufferSize;       // New buffer size  

See Also

Message Properties
MQMSGPROPS
MQReceiveMessage
MQReceiveMessageByLookupId
MQSendMessage
MSMQMessage.Signature
PROPID_M_CONNECTOR_TYPE
PROPID_M_SIGNATURE_LEN