Trecho retirado da doc oficial:
O RPS deverá ter uma assinatura digital. Esta assinatura utilizará o mesmo certificado digital usado na
assinatura da mensagem XML (item 3.2.2A), com os mesmos padrões de criptografia assimétrica RSA e
algoritmo message digest SHA-1.
Para criar a assinatura deverá ser gerado um Hash (utilizando SHA1) de uma cadeia de caracteres
(ASCII) com informações do RPS emitido. Este Hash deverá ser assinado utilizando RSA. A assinatura
do Hash será informada na TAG Assinatura (tipo RPS apresentado no item 4.2.1).
A cadeia de caracteres a ser assinada deverá conter 86 posições com as informações apresentadas na
tabela a seguir:
Com base no trecho da mensagem XML apresentada, montamos a seguinte string de caracteres:
"31000000OL0300000000000120070103TNN00000000205000000000000050000002658100013167474254209999999000106S"
Note que o valor dos serviços (R$ 20.500,00) foi transformado em 2050000, o valor de deduções (R$
5.000,00) foi transformado em 500000. Também foi acrescentado à série do RPS um espaço em branco
à direita para preencher as 5 posições.
Observação: não é necessário informar os dados de intermediário na assinatura se não houver
intermediário. Como exemplo, sem intermediário a string montada seria dessa forma:
"31000000OL03 00000000000120070103TNN00000000205000000000000050000002658100013167474254”
2º - Converta a cadeia de caracteres ASCII para bytes.
3º - Gere o HASH (array de bytes) utilizando SHA1.
4º - Assine o HASH (array de bytes) utilizando RSA-SHA1.