Thursday 22 December 2016

Javamail Content-Transfer-Encoding Binary Options

Estoy tratando de enviar un correo firmado y encriptado S / MIME a mí mismo desde Java Mail (castillo inflable 1.51) a mi perspectiva. Puedo enviar el correo bien, pero la recepción es un problema ya que Outlook no quiere abrir el correo. Lo que sigue es el error que consigo al intentar abrir: No puede abrir este artículo. Su nombre de identificación digital no puede ser encontrado por el sistema de seguridad subyacente. El mismo correo (guardado en un archivo local en formato eml) se ve muy bien con p7m Viewer, lo que indica que el certificado P12 se ha instalado correctamente en mi computadora portátil. He instalado el mismo archivo P12 que estoy usando como Keystore en mi código de Java Mail. ¿Estoy haciendo algo mal? ¿Está el problema en Outlook? Estoy usando Office 365 y quería añadir que p7m Viewer tampoco es capaz de abrir el smime. p7m que descargo desde Outlook WebMail. El error que recibo es: El archivo está dañado Es posible que falte información de la firma. A continuación se muestra el código Java que utilizo para cifrar / enviar correo. Parece que necesita importar su clave privada (en formato. p12) en el almacén de confianza Personal de Outlook. Aquí es cómo hacer eso: Importar su certificado personal: En el menú Herramientas, seleccione Opciones de Internet. Abra la ficha Contenido y haga clic en Certificados. En la ventana Certificados, seleccione su certificado y haga clic en Importar. Trabaje con el Asistente para importación de certificados para importar el archivo de certificado. Al buscar el archivo correcto, cambie el campo Archivos de tipo de. cer,.crt a. pfx,.p12. Se le pedirá la contraseña utilizada para cifrar la clave privada cuando el certificado se exportó inicialmente. Ingresarlo. Deberá seleccionar la opción Activar protección de clave privada fuerte y marcar esta tecla como botones de exportación. Puede seleccionar el almacenamiento que desee. Es más fácil poner todos los certificados en el almacén personal. Haga clic en Finalizar para salir del asistente. Se necesitará un momento para ejecutar la importación. Aparece una ventana para decir que la aplicación está creando un elemento protegido y para que seleccione el nivel de seguridad. Dejarlo en el medio (el valor predeterminado) está bien. Haga clic en Aceptar. Aparece una ventana para indicar que la importación se ha realizado correctamente. Haga clic en OK. It puede ser un poco denso para leer, pero la sección de Content-Transfer-Encoding de RFC 1341 tiene todos los detalles: La situación va un poco de mal en peor. Heres mi resumen: Antecedentes SMTP, por definición (RFC 821), los límites de correo a las líneas de 1000 caracteres de 7 bits cada uno. Esto significa que ninguno de los bytes que envía por la tubería puede tener el bit más significativo (orden superior) establecido en 1. El contenido que queremos enviar a menudo no obedecerá esta restricción de forma inherente. Piense en un archivo de imagen o un archivo de texto que contenga caracteres Unicode: los bytes de estos archivos a menudo tienen su bit 8 puesto a 1. SMTP no permite esto, por lo que necesita utilizar la codificación de transferencia para describir cómo youve trabajado alrededor de la falta de coincidencia . Los valores para el encabezado Content-Transfer-Encoding describen la regla que ha elegido para resolver este problema. 7Bit Codificación 7bit significa simplemente que Mis datos consisten sólo en caracteres US-ASCII, que sólo utilizan los 7 bits inferiores para cada carácter. Youre básicamente garantizar que todos los bytes en su contenido ya se adhieren a las restricciones de SMTP, y por lo que no necesita ningún tratamiento especial. Sólo puede leerlo tal como está. Tenga en cuenta que cuando elige 7 bits. Estás de acuerdo en que todas las líneas de tu contenido tienen menos de 1000 caracteres de longitud. Siempre y cuando su contenido se adhiere a esta regla, 7bit es la mejor transferencia de codificación, ya que no hay trabajo extra necesario sólo leer / escribir los bytes a medida que salen de la tubería. Su también fácil al globo del ojo 7bit contenido y tener sentido de él. La idea aquí es que si usted está escribiendo justo en texto inglés llano usted estará bien. Pero eso no era cierto en 2005 y no es cierto hoy. 8Bit Encoding 8bit means Mis datos pueden incluir caracteres ASCII extendidos que pueden usar el 8º bit (más alto) para indicar caracteres especiales fuera de los caracteres estándar de 7 bits de US-ASCII. Como con 7bit. Todavía hay un límite de línea de 1000 caracteres. 8 bits. Al igual que 7bit. En realidad no hace ninguna transformación de los bytes como theyre escrito o leer desde el cable. Simplemente significa que usted no está garantizando que ninguno de los bytes tendrá el bit más alto establecido en 1. Esto parece un paso más allá de 7 bits. Ya que le da más libertad en su contenido. Sin embargo, el RFC 1341 contiene este tidbit: A partir de la publicación de este documento, no hay transportes estandarizados de Internet para los que es legítimo incluir datos no codificados de 8 bits o binarios en los cuerpos de correo. Por lo tanto, no hay circunstancias en las que el 8bit o binario Content-Transfer-Encoding es realmente legal en Internet. RFC 1341 salió hace más de 20 años. Desde entonces hemos conseguido 8bit Extensiones MIME en RFC 6152. Pero aún así, los límites de línea todavía pueden aplicarse: Tenga en cuenta que esta extensión NO elimina la posibilidad de un servidor SMTP limitación de longitud de línea servidores son libres de implementar esta extensión, sin embargo, establecer una longitud de línea Límite no inferior a 1000 octetos. El binario de codificación binaria es el mismo que 8 bits. Excepto que no hay restricción de longitud de línea. Todavía puedes incluir cualquier personaje que quieras, y no hay codificación adicional. Similar a 8bit. RFC 1341 afirma que no es realmente una codificación de codificación de codificación legítima. RFC 3030 ampliado con BINARYMIME. Citado impreso Antes de la extensión 8BITMIME, había que ser una forma de enviar contenido que no podía ser de 7 bits a través de SMTP. Los archivos HTML (que pueden tener más de 1000 líneas de caracteres) y los archivos con caracteres internacionales son buenos ejemplos de esto. La codificación quoted-printable (Definido en la Sección 5.1 de RFC 1341) está diseñado para manejar esto. Hace dos cosas: Define cómo escapar de caracteres no-US-ASCII para que puedan ser representados en sólo caracteres de 7 bits. (Versión corta: se muestran como un signo de igualdad más dos caracteres de 7 bits). Define que las líneas no tendrán más de 76 caracteres y que los saltos de línea se representarán mediante caracteres especiales (que luego se escaparán). Citado impreso, debido a las fugas y líneas cortas, es mucho más difícil de leer por un humano de 7 bits o 8 bits. Pero soporta una gama mucho más amplia de contenido posible. Codificación Base64 Si sus datos son en gran parte no texto (por ejemplo: un archivo de imagen), usted no tiene muchas opciones. 7bit está fuera de la mesa. 8bit y binario no se admiten antes de la extensión MIME RFC. Citado-imprimible funcionaría, pero es realmente ineficiente (cada byte va a ser representado por 3 caracteres). Base64 es una buena solución para este tipo de datos. Codifica 3 bytes crudos como 4 caracteres US-ASCII, lo cual es relativamente eficiente. El RFC 1341 limita aún más la longitud de línea de datos codificados en base64 a 76 caracteres para encajar dentro de un mensaje SMTP, pero eso es relativamente fácil de administrar cuando solo se está dividiendo o concatenando caracteres arbitrarios en longitudes fijas. El gran inconveniente es que los datos codificados en base64 son prácticamente totalmente ilegibles por los seres humanos, incluso si su texto es simplemente bajo. El campo Content-Transfer-Encoding Header 5. El campo Content-Transfer-Encoding Header Muchos tipos de contenido que podrían ser transportados por correo electrónico son representados en su formato natural como caracteres de 8 bits o datos binarios. Tales datos no pueden ser transmitidos a través de algunos protocolos de transporte. Por ejemplo, el RFC 821 restringe los mensajes de correo a datos de 7 bits US-ASCII con líneas de no más de 1000 caracteres. Por lo tanto, es necesario definir un mecanismo estándar para recodificar tales datos en un formato de línea corta de 7 bits. Este documento especifica que dichas codificaciones serán indicadas por un nuevo campo de encabezado Content-Transfer-Encoding. El campo Content-Transfer-Encoding se utiliza para indicar el tipo de transformación que se ha utilizado para representar el cuerpo de una manera aceptable para el transporte. A diferencia de los tipos de contenido, una proliferación de valores de Content-Transfer-Encoding es indeseable e innecesaria. Sin embargo, el establecimiento de un único mecanismo de Content-Transfer-Encoding no parece posible. Hay una compensación entre el deseo de una codificación compacta y eficiente de datos en gran parte binarios y el deseo de una codificación legible de datos que es mayormente, pero no enteramente, datos de 7 bits. Por esta razón, al menos dos mecanismos de codificación son necesarios: una codificación legible y una codificación densa. El campo Content-Transfer-Encoding está diseñado para especificar una asignación invertible entre la representación nativa de un tipo de datos y una representación que se puede intercambiar fácilmente utilizando protocolos de transporte de correo de 7 bits, como los definidos por RFC 821 (SMTP). Este campo no ha sido definido por ninguna norma anterior. El valor fields es un token único que especifica el tipo de codificación, como se enumeran a continuación. Formalmente: estos valores no distinguen entre mayúsculas y minúsculas. Es decir, Base64 y BASE64 y bAsE64 son todos equivalentes. Un tipo de codificación de 7BIT requiere que el cuerpo ya esté en una representación lista para correo de siete bits. Este es el valor predeterminado, es decir, Content-Transfer-Encoding: 7BIT se asume si el campo de encabezado Content-Transfer-Encoding no está presente. Los valores 8bit, 7bit y binario significan que la codificación NO se ha realizado. Sin embargo, son potencialmente útiles como indicaciones del tipo de datos contenidos en el objeto y, por tanto, del tipo de codificación que puede ser necesario realizar para la transmisión en un sistema de transporte dado. En particular: La diferencia entre 8 bits (o cualquier otro token de bit de bits concebible) y el token binario es que binario no requiere adherencia a ningún límite de longitud de línea oa la semántica de CRLF de SMTP, mientras que los tokens de anchura de bit requieren tal adherencia. Si el cuerpo contiene datos en cualquier ancho de bit distinto de 7 bits, debe utilizarse el token de codificación de transferencia de contenido de ancho de bit apropiado (por ejemplo, 8 bits para datos no codificados de 8 bits de ancho). Si el cuerpo contiene datos binarios, debe utilizarse el token binario Content-Transfer-Encoding. Los implementadores pueden, si es necesario, definir nuevos valores de Content-Transfer-Encoding, pero deben usar un token x, que es un nombre prefijado por X - para indicar su estado no estándar, p. Content-Transfer-Encoding: x-my-new-encoding. Sin embargo, a diferencia de Content-Types y subtipos, la creación de nuevos valores de Content-Transfer-Encoding es explícita y fuertemente desalentada, ya que parece que dificulta la interoperabilidad con poco beneficio potencial. Su uso está permitido sólo como resultado de un acuerdo entre agentes de usuario cooperantes. Si aparece un campo de encabezado Content-Transfer-Encoding como parte de un encabezado de mensaje, se aplica a todo el cuerpo de ese mensaje. Si un campo de encabezado Content-Transfer-Encoding aparece como parte de los encabezados de las partes del cuerpo, sólo se aplica al cuerpo de esa parte del cuerpo. Si una entidad es de tipo multipart o mensaje, no se permite que Content-Transfer-Encoding tenga ningún valor distinto de un ancho de bit (por ejemplo, 7 bits, 8 bits, etc.) o binario. Debe señalarse que el correo electrónico está orientado a los caracteres, por lo que los mecanismos descritos aquí son mecanismos para codificar secuencias de octetos arbitrarias, no flujos de bits. Si se quiere codificar una secuencia de bits a través de uno de estos mecanismos, primero debe convertirse a una secuencia de bytes de 8 bits utilizando el orden de bits estándar de la red (big-endian), en el que los bits anteriores Ordenar bits en un byte. Una secuencia de bits que no termina en un límite de 8 bits debe estar rellenada con ceros. Este documento proporciona un mecanismo para anotar la adición de tal relleno en el caso de la aplicación Content-Type, que tiene un parámetro de relleno. Los mecanismos de codificación definidos aquí codifican explícitamente todos los datos en ASCII. Por ejemplo, supongamos que una entidad tiene campos de encabezado como: Esto debe interpretarse para significar que el cuerpo es una codificación ASCII base64 de datos que estaba originalmente en ISO-8859-1, y que estará en ese conjunto de caracteres nuevamente después de decodificar . Las siguientes secciones definirán los dos mecanismos de codificación estándar. La definición de nuevas codificaciones de transferencia de contenido es explícitamente desalentada y sólo debe ocurrir cuando sea absolutamente necesario. Todo el espacio de nombres de codificación de transferencia de contenido excepto que el comienzo de X - está explícitamente reservado a la IANA para uso futuro. También se desaconsejan explícitamente los acuerdos privados sobre las codificaciones de transferencia de contenido. Ciertos valores de Content-Transfer-Encoding sólo se pueden utilizar en determinados Content-Types. En particular, está expresamente prohibido utilizar cualquier codificación distinta de 7 bits, 8 bits o binaria con cualquier tipo de contenido que incluya recursivamente otros campos de tipo de contenido, especialmente el multipart y el mensaje Content-Types. Todas las codificaciones que se desean para cuerpos de tipo multipart o mensaje deben hacerse en el nivel más interno, mediante la codificación del cuerpo real que necesita ser codificado.


No comments:

Post a Comment